我开始学习递归并尝试解决以下问题: 问题陈述: 需要找到二进制数的连续计数:
示例:
13的二进制表示是1011,所以最大数量为 连续1是2。
我在while循环的帮助下实现了上述目标。但是,我尝试通过递归实现解决方案,但面临问题:
使用While循环:
int counter = 0, max =0, n=13;
while (n > 0) {
int rem = n%2;
if (rem==1) counter++;
else counter=0;
max = Math.max(counter, max);
n/=2;
}
System.out.println(max);
Result : 2
递归:
public static int returnCount(int n,int count,int max){
if (n > 0){
int temp=n%2;
if(temp==1)
count++;
else
count=0;
n/=2;
max=Math.max(count,max);
returnCount(n,count,max);
}
return max;
}
结果:1
请帮我纠正上述代码中的错误。
答案 0 :(得分:1)
当你对 returnCount 进行递归调用时,你永远不会使用它返回的值。在您的解决方案中,如果 n 为奇数,则 returnCount 始终返回1,因为从不使用递归调用 returnCount 的返回值。
public static int returnCount(int n, int count, int max) {
if (n > 0){
if(n % 2 == 1)
count++;
else
count = 0;
n /= 2;
max = Math.max(count, max);
max = returnCount(n, count, max);
}
return max;
}
为了证明我的观点,我会稍微浏览一下代码。如果我们对您的代码运行以下调用:
int answer = returnCount(13, 0, 0);
我们最终得到以下方法调用:
returnCount(13, 0, 0)
returnCount(6, 1, 1)
returnCount(3, 0, 1)
returnCount(1, 1, 1)
returnCount(0, 2, 2)
在第四次调用的迭代期间, count 增加到2, max 被赋值为2,因为 count > MAX 的。通过第五次调用,找到答案, max 仍为2.
但是,从第一次调用返回时,仍然会为本地变量 max 分配1.并且我们的问题的正确答案会丢失,因为它永远不会从您的第四次和第五次调用返回溶液
答案 1 :(得分:0)
在代码中,在最后一个递归方法中返回 max 。此行将执行 N 次,其中 N 是递归方法被调用的次数
如果我们在每次递归调用时将 max 值存储在堆栈中,我们将从返回行获取堆栈中的所有值。但是,您只会收到第一次调用计算出的第一个值( 0或1 )(因为它将在最后执行)。
因此,不要为递归添加 max ,因为每次调用都会更改 max 。只需使用 max 作为全局变量, max 就是您的答案。