1

我正在逐步执行下面的代码,我不明白的部分是“离开”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
4

1 回答 1

1

首先,我相信你的输出有错误。当我通过调用值为 5 来运行上述代码fun2()时,我得到了除 line 之外的Leaving10---->0所有输出。您确定这是在fun2()函数的输出中,还是来自您调用的代码位置的工件fun2()?也许您正在调用fun2()值为 10 的函数,而忽略了输出的第一行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,方法返回

当您将单个控制台输出放在一起时,您会得到 101,它是 5 的二进制。

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

1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10
于 2013-07-08T02:04:12.840 回答