我正在寻找一个简单的十进制到二进制转换程序,然后,使用递归遇到了以下程序。
void bin(unsigned n)
{
/* step 1 */
if (n > 1)
bin(n/2);
/* step 2 */
printf("%d", n % 2);
}
int main(void)
{
bin(4);
return 0;
}
此计划的输出符合预期100
。但是,我无法理解它如何显示输出100
,因为根据我的说法,输出应该是1
(不正确)而不是100
。
以下是我对bin
函数的步骤的解释。
4
作为bin
的参数。4 > 1
因此,它将再次使用参数2调用bin
函数。2 > 1
因此,它将再次使用参数1调用bin
函数。1
不大于1
,我们将转到步骤2
,编译器将打印1
(自1%2=1
起),因此,此计划应仅打印1
,而不是100
。任何人都可以解释并指导我在哪里错了吗?
答案 0 :(得分:2)
也许插图序列会让您更容易理解:
bin(4)
bin(2)
bin(1)
printf("%d",1%2); // 1
printf("%d",2%2); // 0
printf("%d",4%2); // 0
答案 1 :(得分:2)
你走在正确的轨道上,
我们先将4作为bin的参数。
bin(4):4>因此,它将再次使用参数2调用bin函数。函数执行尚未完成。执行被调用函数后,程序将返回此处
bin(2):现在,2>因此,它将再次使用参数1调用bin函数。函数执行尚未完成。执行被调用函数后,程序将返回此处
bin(1):由于1不大于1,我们将转到步骤2,编译器将打印1(因为1%2 = 1),因此,该程序应打印" 1&#34 ;.功能执行完成
因此,输出是' 100'
答案 2 :(得分:0)
将整数除以2与将其向右移一位相同。因此,使用递归,它将位向右移位,直到只剩下1位(最左边的位)
然后打印最左边的位并返回。返回时,仍然有两个位,最左边和最左边一个。使用% 2
它会丢弃所有最左边的位并打印出最左边的位。现在它返回......等等。
这有效地从左到右打印这些位。
答案 3 :(得分:0)
用你的逻辑:
somefunc();
someotherfunc();
当somefunc()
完成此操作时,someotherfunc()
将在somefunc()
完成后才会执行。
当完成对bin
的调用或者根本不执行调用时,步骤2完成,然后步骤2始终完成。因此,bin
的每次迭代都会输出一些东西,因为它是之后的,它会从最深处进行,然后从实际的递归路径开始以相反的顺序进行打印。
对bin
的每次调用都有自己的局部变量,因此它们不会相互干扰。因此,当bin
来自bin
的呼叫完成时,n
与之前相同,但返回的bin
的{{1}}只有来自呼叫者的一半n
{ {1}}。