递归 - 在二进制表示中找到连续计数1

时间:2018-02-21 08:38:54

标签: java algorithm recursion data-structures binary

我开始学习递归并尝试解决以下问题: 问题陈述: 需要找到二进制数的连续计数:

  

示例:

     
    

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​​

请帮我纠正上述代码中的错误。

2 个答案:

答案 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);

我们最终得到以下方法调用:

  1. returnCount(13, 0, 0)
  2. returnCount(6, 1, 1)
  3. returnCount(3, 0, 1)
  4. returnCount(1, 1, 1)
  5. returnCount(0, 2, 2)
  6. 在第四次调用的迭代期间, count 增加到2, max 被赋值为2,因为 count > MAX 的。通过第五次调用,找到答案, max 仍为2.

    但是,从第一次调用返回时,仍然会为本地变量 max 分配1.并且我们的问题的正确答案会丢失,因为它永远不会从您的第四次和第五次调用返回溶液

答案 1 :(得分:0)

在代码中,在最后一个递归方法中返回 max 。此行将执行 N 次,其中 N 递归方法被调用的次数

如果我们在每次递归调用时将 max 值存储在堆栈中,我们将从返回行获取堆栈中的所有值。但是,您只会收到第一次调用计算出的第一个值( 0或1 )(因为它将在最后执行)。

因此,不要为递归添加 max ,因为每次调用都会更改 max 。只需使用 max 作为全局变量, max 就是您的答案。