2017-11-28 9 views
0

まず最初に、私はCの初心者です。私たちは大学で「構造化プログラミング」を学んでいます。Cとprintfの再帰関数

ここで、「再帰関数」に関する最後のいくつかの講義は、私にとっては初心者として苦労しています。あなたの誰もが親切にも私に説明することができ、この:

だから私はこの小さなスクリプト、小数をとり、バイナリ1に変換再帰関数があります。今

#include <stdio.h> 

void binary(int num) 
{ 
    if (num == 0) return; 

    binary(num/2); 
    printf("%d", num % 2); 
} 

int main() 
{ 
    int n; 
    scanf("%d", &n); 
    binary(n); 
    return 0; 
} 

私は思っていたがこの機能はどのように機能しますか?私はそれの背後にある論理を知っていて、それは何をすべきかを知っていますが、私はそれがどのようにITを行うのか分かりません。一番下のprintfは、特に、printf関数が再帰呼び出しの前にある場合、10進数10の場合は(0101)が出力されますが、その下に正しいバイナリ番号(1010)が出力されている場合はどうですか?

どんな種類のヘルプでも大変感謝しています。

+5

あなたのプログラムは鉛筆と紙で簡単に「手作業で」実行するとわかります。 –

答えて

0

逆転は、関数の呼び出しスタックを使用して行われます。これは、関数が呼び出される方法を意味し、これはMSBが最初に印刷され、次に印刷されるということを保証します。

void binary(int num) 
{ 
    if (num == 0) return; 

    binary(num/2); // Wait, I will print but you first print the MSB's. 
    printf("%d", num % 2); // Now I print the last digit. 
} 

下方への移動は、呼び出しを移動します。

{binary(12)      
    {binary(6)     
     {binary(3)   
     {binary(1) 
      binary(0) -- returns 
     Now we print 1 
     } 
     print 1 
     } 
    prints 0 
    } 
prints 0 
} 
+0

私はこれに気づいていませんでしたが、あなたと@Michael Waltzに感謝しました。私は本の中でコールスタックについてより多くのことを読んでいる時間を過ごすでしょう、ありがとう。 – Baron