- ベストアンサー
funcの値
こんにちは! 以下のプログラムですがいまひとつ流れが 分からずにいます、5を入力すると120が出力 されるのですが、(5-1)*5なので20ではないのでしょうか?? どなたか宜しければ教えてくださいm(_ _)m #include <stdio.h> double func(double n){ if ( n > 0 ) { return func ( n - 1 ) * n; } else { return 1; } } int main(){ int n; scanf("%d",&n); printf("%.0f\n",func(n)); return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
関数が再帰呼び出しになってます。 値に5を入れた場合 func(n-1)→func(n-1-1)→・・・→func(1)→func(0) (値が0の為、if条件でfuncは再帰呼び出しされないで、1が帰ってくる。) と繰り返し呼び出されます。 func(5) = func(4) * 5; = func(3) * func (4) * 5; = func(2) * func(3) * func (4) * 5 = func(1) * func(2) * func(3) * func (4) * 5 = func(0) * func(1) * func(2) * func(3) * func (4) * 5 = (1) * func(1) * func(2) * func(3) * func (4) * 5 = (1 * 1) * func(2) * func(3) * func (4) * 5 = (1 * 2) * func(3) * func (4) * 5 = (2 * 3) * func (4) * 5 = (6 * 4) * 5 = 24 * 5 = 120 したがって答えは、 5*4*3*2*1=120 であっています。 ちなみに func(4) → 24 func(3) → 6 func(2) → 2 func(1) → 1 func(0) → 1 になるはずです。
その他の回答 (3)
- ebinamori
- ベストアンサー率21% (96/439)
初心者だからよくわからないけど funcという関数に渡す値の型が違うけどいいの? (intとdouble) あとこれは再帰を使ったプログラムで 5の階乗を返すのだと思います。 5をfuncに渡すと 0より大きいからfunc(n-1)*nが実行されて n-1、つまり4がfuncに渡される。 以下同じ用に実行されて nが0になったとき0より小さいので 1が返される。 そこから逆に実行されていく。 funcに1を渡して帰ってきたものと1をかける(func(1-1)*1=1) 以降func(2-1)*2=2 func(3-1)*3=2*3=6 func(4-1)*4=6*4=24 func(5-1)*5=24*5=120 となりこれがfuncに5を渡したときの関数値になり 120が出力されるわけです。 かなり分かり辛いですが わたしののうりょいくだとこれが精一杯
お礼
お返事有難うございます! なるほど単に一度計算するのではなく5の階乗を返すものなのですね! >>funcという関数に渡す値の型が違うけどいいの? このソースはHPにあるやつをコピペしてきたものなので良くわかりません^^;
- HOGERA3
- ベストアンサー率35% (50/139)
『再帰』のお話ですね。 >(5-1)*5なので20ではないのでしょうか?? (5-1)*5 じゃなくて func(5-1)*5 です。 詳しいことは、参考URLのページをご覧ください。
お礼
お返事有難うございます! 参考にしたいと思います^^
- winterofmeei
- ベストアンサー率22% (20/88)
「再帰的呼び出し」というのをご存知ですか? 『(5-1)*5なので20ではないのでしょうか?』 (5-1)*5ではなく、func(5-1)*5が返されます。当然これは20ではありません。 func(4)はfunc(4-1)*4という値をもちます。 そしてfunc(3)はfunc(3-1)*3を……というように計算されます。 nが0以下の入力に対してfunc()は1となるので、5を入力したときは、5*4*3*2*1=120となります。
お礼
お返事有難うございます! >>「再帰的呼び出し」というのをご存知ですか? 値呼び出しはしっていたのですが こういった問題ははじめてで計算の仕方が良く分かっていませんでした^^; もう一度基礎を勉強指したいとおもいます^^
お礼
なるほど!理解できました^^ 丁寧に説明していただき有難うございました!!