编写一个递归函数来计算零的数量

3

可以通过递归方法计算整数中零的数量,该方法接受一个int参数并返回参数中零的数量。

因此:

zeroCount(1000)

Would Return:

3

您可以通过以下方式从整数中删除最后一位数字:"12345 / 10" = 1234。
您可以通过以下方式获取整数的最后一位数字:"12345 % 10" = 5。
这是我目前为止的内容:
public static int zeroCount(int num)
{
    if(num % 10 == 0)
        return num;
    else
        return zeroCount(num / 10);
}

有没有人对帮助我解决这个函数有什么建议或想法?


1
基础情况是错误的。有很多值使得x % 10等于0。(模数运算可能应该合并到递归情况中。) - user166390
16个回答

6
public static int zeroCount(int num)
{
    if(num == 0)
       return 0;

    if(num %10 ==0)
        return 1 + zeroCount(num / 10);
    else
        return zeroCount(num/10); 
}

这将有效。

非常感谢,现在我将尝试自己计算任何数字的数量。 - Matt Andrzejczuk
发生了一些无法解释的事情,我正在尝试将这个递归方法分成几个部分来看看它是如何工作的。当该方法开始并且num = 1230005时,如果(num / 10 != 0)为真,则会移动到下一个if语句:if(num%10 == 0),而1230005 % 10等于0.5,这在技术上是0,因为它是int而不是double。但是,即使num % 10(1230005%10)等于0,它也不会返回1 + zeroCount(num / 10),而是直接进入else。我错过了什么?它是如何跳过“if(num%10 == 0)”这个语句的? - Matt Andrzejczuk
@MattAndrzejczuk,我知道这篇帖子已经很久了(超过十年),但你是在使用Java还是Javascript?问题的标签表明是Java。你说"1230005 % 10等于0.5,从技术上讲是0,因为它是int而不是double"让我觉得你在考虑Javascript。记住,Javascript不像Java那样具有强类型。在Javascript中,你的数字被视为浮点精度处理。请参考这里:https://dev59.com/vm865IYBdhLWcg3wIrBg#3966511 - Mike Christiansen

5

在脑中运行您的代码:

zeroCount(1000)

1000 % 10 == 0,因此将返回1000。这没有意义。


只需弹出每个数字并重复:

听起来像是作业,所以我会把实际代码留给你,但可以这样做:

zeroes(0) = 1
zeroes(x) = ((x % 10 == 0) ? 1 : 0) + zeroes(x / 10)

请注意,如果没有终止条件,它可能会无限递归。

1
这里有三个条件:
1. 如果数字是一位数且为0,则返回1
2. 如果数字小于10,即它是一个数字1、2、3......9,则返回0
3. 对于零(number/10)+ 零(n%10),调用递归函数
zeros(number){
  if(number == 0 ) //return 1
  if(number < 10) //return 0
  else
       zeros(number/10) + zeros(number%10)
}

n/10将给我们左侧的n-1位数字,n%10获取单个数字。 希望这可以帮到你!


1

检查这个正整数:

 public static int zeroCount(int number) {
    if (number == 0) {
      return 1;
    } else if (number <= 9) {
      return 0;
    } else {
      return ((number % 10 == 0) ? 1 : 0) + zeroCount(number / 10);
    }
  }

0
你需要在if和else语句中都调用递归函数。此外,你还缺少一个基本情况:-
public static int zeroCount(int num)
{
    if(num % 10 == 0)
        return 1 + zeroCount(num / 10);
    else if (num / 10 == 0)
        return 0;
    else
        return zeroCount(num / 10);
}

2
这里没有基本情况。无限递归! - user166390
1
这将导致 StackOverflowException。缺少退出条件。(楼主可以为此找到解决方案,只是让他知道一下 ;) ) - Andreas Dolk
@Andreas_D。是的,我在最后一行引用了那个。 :) - Rohit Jain
@BhavikShah.. 你的代码肯定能够工作,但它并没有帮助到 OP。他只会复制粘贴。所以,请先取消你的踩票。 - Rohit Jain
1
嘿,伙计们,这不是Facebook。 - Shurmajee
显示剩余3条评论

0

这是一个简单的问题,你不需要使用递归。我认为更好的方法是将整数转换为字符串并检查字符'0'。

public static int zeroCount(int num)
{
String s=Integer.toString(num);
int count=0;
int i=0;
for(i=0;i<s.length;i++)
{
if(s.charAt(i)=='0')
{
count++;
}
}
return count;
}

0
你知道 x % 10 可以得到 x 的个位数,因此你可以用它来识别零。此外,在检查特定数字是否为零之后,你想要将该数字移除,怎么做呢?除以 10
public static int zeroCount(int num)
{
  if(num == 0) return 1;      
  else if(Math.abs(num) < 9)  return 0;
  else return (num % 10 == 0) ? 1 + zeroCount(num/10) : zeroCount(num/10);
}

我使用math.Abs来允许负数,你需要导入java.lang.Math;


0
int countZeros(int n) 
{
if(n==0)
{
    return 1;
}
if(n<10) // Needs to be java.lang.Math.abs(n)<10 instead of n<10 to support negative int values
{
    return 0;
}
int ans = countZeros(n/10);
if(n%10 == 0)
{
    ans++;
} 
return ans;
}

1
你好。请注意,此算法不支持负整数。 - João

0

公共静态整数 countZerosRec(int input){ // 在此编写您的代码

    if(input == 0)
        return 1;
    
    if(input <= 9)
        return 0;
    
    if(input%10 == 0)
        return 1 + countZerosRec(input/10);
    
    return countZerosRec(input/10);
}

0
static int cnt=0;
    public static int countZerosRec(int input) {
        // Write your code here
        if (input == 0) {
            return 1;
        }      
        if (input % 10 == 0) {
            cnt++;           
        }
        countZerosRec(input / 10);                  
        return  cnt;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接