我开始学习递归,并试图解决以下问题:
问题陈述:
需要查找二进制数中的连续计数:
例子:
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
请帮我纠正我在上述片段中的错误。
最佳答案
当您对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我们的问题的正确答案已经丢失了,因为在您的解决方案中,第四次和第五次调用都没有返回它。