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

09-25 20:23