这个十进制到二进制转换程序如何工作?

时间:2017-02-08 12:12:10

标签: c recursion binary

我正在寻找一个简单的十进制到二进制转换程序,然后,使用递归遇到了以下程序。

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函数的步骤的解释。

  1. 我们首先将4作为bin的参数。
  2. 4 > 1因此,它将再次使用参数2调用bin函数。
  3. 现在,2 > 1因此,它将再次使用参数1调用bin函数。
  4. 由于1不大于1,我们将转到步骤2,编译器将打印1(自1%2=1起),因此,此计划应仅打印1,而不是100
  5. 任何人都可以解释并指导我在哪里错了吗?

4 个答案:

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

你走在正确的轨道上,

  1. 我们先将4作为bin的参数。

  2. bin(4):4>因此,它将再次使用参数2调用bin函数。函数执行尚未完成。执行被调用函数后,程序将返回此处

  3. bin(2):现在,2>因此,它将再次使用参数1调用bin函数。函数执行尚未完成。执行被调用函数后,程序将返回此处

  4. bin(1):由于1不大于1,我们将转到步骤2,编译器将打印1(因为1%2 = 1),因此,该程序应打印" 1&#34 ;.功能执行完成

  5. bin(2):程序现在返回到调用者函数并打印0(因为2%2 = 0)。功能执行完成
  6. bin(4):程序现在返回调用函数并打印0(因为2%2 = 0)。功能执行完成
  7. 因此,输出是' 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}}。