我正在逐步执行下面的代码,而我不理解的部分是“离开”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
答案 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)。
这里详细介绍了该方法的每个递归级别:
当您将单个控制台输出放在一起时,您将获得101,这是5的二进制文件。
如果您使用参数值10调用fun2()
,您会看到输出1010
:
1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10