2012-03-06 17 views
1

これは私がちょうど私が何をするべきか分からないことを与えられたこの練習試験から取られた別の質問です。自分自身を呼び出す関数の流れにどうやって従うのですか?

int fun5 (int c, int d) { 
    if (c <= d) { 
     return c; 
    } else { 
     return fun5(c-d, d) * c; 
    } 
} 

あなたがfun5の値(9,3)を使用してコードを実行すると、あなたが162を取得することになって、私はどのようにそこにアイデアを持っていないしています。明らかに最初のif文はfalseなので、elseに行きますが、新しい値でfun5に戻る必要がありますが、if文が再び失敗するので、elseにもう一度行きますが、そこ。私はちょうど今非常に混乱している人です。

答えて

2

それは

再帰

だ初めてC = 9およびD = 3あなたはelseステートメントを実行します(下の置換番号で)

return fun5(9-3, 3) * 9; 

次にあなたがCで次行きます= 6およびD = 3ので、あなたが他再び

return fun5(6-3, 3) * 6; 

次に、あなたがC = 3、D = 3で次のいずれかの操作を行いますので、あなたがもし

01をしますか

は、あなたが最終リターン

return 3; 
return 3 * 6; 
return 18 * 9; 

を取得スタックがトウェインの答えと一緒に18 * 9または162

+0

ああ、あなたはそれをバックアップする。私はそれを知らなかった。私は再帰についてちょっと読まなければならないだろうと思う。どうもありがとう! –

4

これをトレースして、何が起こるか見てみましょう!

その後、

fun5(9, 3) 
= fun5(9 - 3, 3) * 3 
= fun5(6, 3) * 9 

まあの値を返しますfun5(9, 3)を呼び出すと、我々は

fun5(6, 3) 
= fun5(3, 3) * 6 

が続い

fun5(3, 3) = 3 

だからこれが意味することを持っている

fun5(6, 3) 
= fun5(3, 3) * 6 
= 3 * 6 
= 18 

は、これはあなたの答えはどこから来る

fun5(9, 3) 
= fun5(6, 3) * 9 
= 18 * 9 
= 162 

がどちらであることを意味します。

希望すると便利です。

+0

で、これは助けを行い、それをフォローアップ。ありがとう! –

関連する問題