C言語関係掲示板

過去ログ

No.311.再帰的関数の動き

[戻る] [ホームページ]
No.1906

再帰的関数の動き
投稿者---さくら(2002/07/02 13:27:37)



#include <stdio.h>

int fact(int n);

main()
{
int a, b;

printf("a=");
scanf("%d", &a);

b = fact(a);

printf("%d! = %d\n",a, b);

}

int fact(int n)
{
int dum;

if (n == 0)
dum = 1;
else
dum = n * fact(n - 1);

return dum;

このソースはどのように動くのですか?全く理解できません。

No.1907

Re:再帰的関数の動き
投稿者---shu(2002/07/02 13:58:18)



>このソースはどのように動くのですか?全く理解できません。

過去ログのページで”再帰”で検索すれば、いくつかヒットしますよ。

過去ログのページはこちらです
http://f1.aaa.livedoor.jp/~pointc/


No.1917

Re:再帰的関数の動き
投稿者---ともじ(2002/07/02 23:09:50)


こんばんは。

>このソースはどのように動くのですか?全く理解できません。

ここで図を書いて説明していますね。
参照してみてください。
http://f1.aaa.livedoor.jp/~pointc/log154.html

No.1969

Re:再帰的関数の動き
投稿者---さくら(2002/07/05 13:59:10)


>こんばんは。
>
>>このソースはどのように動くのですか?全く理解できません。
>
>ここで図を書いて説明していますね。
>参照してみてください。

参照したんですがなんかまだ曖昧なんです。誰か教えてください。

No.1971

Re:再帰的関数の動き
投稿者---差猫(2002/07/05 15:51:56)


fact関数の引数が3のとき、3*fact(2)を計算します。
しかし、3*fact(2)がいくつになるかはfact(2)を実行するまでわかりません。
というわけで3*fact(2)は後で計算するものとして未処理のまま残しておき、とりあえずfact(2)の値を求める処理に移ります。

fact(2)の処理では、2*fact(1)を計算しなければならないことがわかります。
しかし、2*fact(1)がいくつになるかはfact(1)を実行するまでわかりません。
2*fact(1)は後で計算するものとして未処理のまま残しておき、fact(1)の値を求める処理に移ります。

fact(1)の処理では、1*fact(0)を計算しなければならないことがわかります。
しかし、1*fact(0)がいくつになるかはfact(0)を実行するまでわかりません。
1*fact(0)は後で計算するものとして未処理のまま残しておき、fact(0)の値を求める処理に移ります。

fact(0)の処理では、fact(0)は1になることがわかります。

fact(0)の処理を脱出すると、fact(1)の処理の途中で、1*fact(0)の計算をまだ行っていないことに気付きます。
fact(0)は1なので1*fact(0)は1となります。
この計算結果がfact(1)の戻り値となります。
ここでやっとfact(1)の処理を脱出できます。

fact(1)の処理を脱出すると、fact(2)の処理の途中で、2*fact(1)の計算をまだ行っていないことに気付きます。
fact(1)は1なので2*fact(1)は2となります。
ここでやっとfact(2)の処理を脱出できます。

fact(2)の処理を脱出すると、fact(3)の処理の途中で、3*fact(2)の計算をまだ行っていないことに気付きます。
fact(2)は2なので3*fact(2)は6となります。
ここでやっとfact(3)の処理を脱出できます。

これでやっとすべてのfactを脱出できます。
というわけで3を入力したときは結果は6となります。

未処理の式を未処理のまま終わらせてしまうために勘違いする人が多いようです。
未処理の式をちゃんと覚えておくことが重要です。


No.1973

Re:再帰的関数の動き
投稿者---さくら(2002/07/05 16:07:09)


ありがとうございました。わかりました。