2017-03-25 10 views
-2

出力が「0,1,2,0」になっています。この関数呼び出しがどのように動作しているかを助けてください。私は、nを減じた後に文が実行されないなら、0より大きくないので、この疑いがあります。したがって、出力はありません。しかし結果は他のものです。if文と関数呼び出しの制御フロー

#include <stdio.h> 

void fun(int); 

int main(void) 
{ 
    int a=3; 
    fun(a); 
    return 0; 
} 

void fun(int n) 
{ 
    if(n > 0) 
    { 
     fun(--n); 
     printf("%d,", n); 
     fun(--n); 
    } 
} 
+2

紙を取得し、通話シーケンスを書き出します。 'a'が小さいとすれば、それは簡単だろう。 – ForceBru

+0

'printf'文をもう少し書いてください。例: 'if'ブロックの前に、その呼び出しで最初に' n'の値を知るためにもう1つの文を書きます。 – Cherubim

+0

無礼は意味しませんが、どのような再帰がわかりますか?もしそうでなければ、例えばhttps://en.wikipedia.org/wiki/Recursion_(computer_science)でそれを読むことができます。あなたが知っているなら、あなたが質問の他の側面に焦点を当てることを知っているので、どのような再帰があなたの質問であるかを知っていることを追加してください。 –

答えて

0

あなたはprintf()後自体の中からfun()、前の両方を呼んでいます。したがって、printfは、深いの呼び出しがfun()の最初のと表示されます。

@ForceBruは絶対に正しいです。プログラマになりたい場合は、にはが必要です。あなたの頭や紙にコードをトレースすることができます。ここに例があります。 fun()の最初の呼び出しに

、3 3> 0はそうfun()そうnが2に設定されている_pre_decremented値(と、再び呼び出されているように、および図2にfun()に渡される。

プロセス全体再び起こる。2> 0そう--n又は1をfunに渡される。

を深い第3の呼び出しでは、nは依然として0より大きいだ1であるので、fun(--n)が再度実行され、nは0

にプリデクリメントされています

fun()の4回目の呼び出しでは、nは最後に0になります。

3回目の呼び出しでは、最初にfun()が返されます。 Rember、このfun()呼び出しのnは1でしたが、今回は0に減少しました。 0が印刷されます。 nが再びデクリメントされ(-1、符号付き整数)、fun(-1)が呼び出されますが、-1 > 0はfalseなので何も起こりません。 3番目の呼び出しが戻ります。

第二の呼び出しは2を通過したが、以降に印刷される1 1にデクリメントし、次いでfun(--n)fun(0)になり、次fun() invcocation is楽しい(-1)and also does nothing. The second invocation of楽しい() `戻ります。

最後に、メインからのfun()の最初の呼び出しがagianを実行しています。それは3で始まったが、2に減少した.2が印刷される。その後、--n、または1が最後にfun()に転送されます。 1>0だからfun() is invoked again, and outputs - 1 or 0 just like it did the first time it was passed a 1. The first invocation's recursive calls to fun()then finish, and the program finishes, having output a 0,1,2,0である。

再帰関数はかなり混乱する可能性があるので、紙の上を自分自身で歩いていくのですか?私がコードを辿るまで、なぜあなたはその出力を自分で得たのか分かりませんでした。私は20年間Cでプログラミングしてきました!

関連する問題