调试递归函数

时间:2013-07-08 01:48:43

标签: java debugging recursion

我正在逐步执行下面的代码,而我不理解的部分是“离开”n值如何变为2,5和10.我理解递归调用的第一部分,直到n == 0,并且返回控制移动到else部分并打印(0%2)。程序不应该在那之后停止吗?

void fun2(int n){
    System.out.println("Entering"+n);
    if(n==0)
        return;
   else{
        fun2(n/2);
        System.out.print("Leaving"+n+"---->");       
        System.out.println(n%2);
    }
}

输出:

      Entering5
      Entering2
      Entering1
      Entering0
      Leaving1---->1
      Leaving2---->0
      Leaving5---->1
      Leaving10---->0

1 个答案:

答案 0 :(得分:1)

首先,我相信你的输出有误。当我通过调用值为5的fun2()来运行上述代码时,我会获得您已指示的所有输出,但行Leaving10---->0 除外。您确定这是fun2()函数的输出,还是来自您调用fun2()的代码位置的工件?也许您正在调用值为10的fun2()函数,而不是输出的第一行Entering10

此功能通过计算每个二进制数字的值来工作。这是使用%运算符完成的,在else块的最后一行中称为模运算符(也称为余数运算符):System.out.println(n%2);

101 = (1*2^2) + (0*2^1) + (1*2^0) = 4 + 0 + 1 = 5

每次迭代计算下一个较低的2次幂,因为它是用n/2调用的。请记住,你在这里处理整数除法,所以没有余数。 1/2 = 0,而不是0.5。但是,整数模数函数可以正常工作,因此1%2 = 1(1除以2 = 0,余数为1)。

这里详细介绍了该方法的每个递归级别:

  1. n = 5,n / 2 = 2,fun2(2),n%2 = 1
  2. n = 2,n / 2 = 1,fun2(1),n%2 = 0
  3. n = 1,n / 2 = 0,fun2(0),n%2 = 1
  4. n = 0,方法返回
  5. 当您将单个控制台输出放在一起时,您将获得101,这是5的二进制文件。

    如果您使用参数值10调用fun2(),您会看到输出1010

    1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10