C言語関係掲示板

過去ログ

No.154.再帰関数のreturnの動作


No.991

return文の動作
投稿者---aka(2002/01/30 16:14:22)


return文の動作について、教えてください。
例えば、
#include <stdio.h>

int func(int i)
{
	if (i == 10) return 12;

	return 4;
}

int main()
{
	int i = 5;

	printf("%d\n", func(i));
	
	return 0;
}

のような場合のreturnの動作は理解できるのですが、
#include <stdio.h>

int fact(int n)
{
	int n1;
	int fc;

	if (n == 1) return 1; // ←(1)

	n1 = fact(n - 1);
	fc = n * n1;

	return fc;
}

int main()
{
	printf("fact(4)=%d\n", fact(4));

	return 0;
}

のような場合での、returnの動作の仕方がよくわかりません。
デバッガのステップインで一行ずつ実行してみたのですが、(1)の所で
n = 1の場合の時の動作がよくわからないです。
自分は、n = 1の場合、main関数に戻ってfact(4)=1と表示されるのではと
思っていたのですが、fact(4)=24と表示されます。

宜しくお願いします。


No.992

Re:return文の動作
投稿者---ともじ(2002/01/30 17:47:16)


こんにちは。

>のような場合での、returnの動作の仕方がよくわかりません。
>デバッガのステップインで一行ずつ実行してみたのですが、(1)の所で
>n = 1の場合の時の動作がよくわからないです。
>自分は、n = 1の場合、main関数に戻ってfact(4)=1と表示されるのではと
>思っていたのですが、fact(4)=24と表示されます。

ご提示のプログラムは再帰構造をしていますので、fact関数から
fact関数が、n-1が1になるまで呼びつづけられます。
ご提示のプログラムに以下のようにprintfを入れると、実行結果は以下の
ようになります。

#include <stdio.h>
int fact(int n)
{
	int n1;
	int fc;

	printf("fact start n:%d\n",n);

	if (n == 1) {
		printf("返却値:1\n");
		return 1;
	}

	n1 = fact(n - 1);
	fc = n * n1;

	printf("返却値:%d\n",fc);
	return fc;
}

int main()
{
	printf("fact(4)=%d\n", fact(4));

	return 0;
}

実行結果
fact start n:4
fact start n:3
fact start n:2
fact start n:1
返却値:1
返却値:2
返却値:6
返却値:24
fact(4)=24


これは、つまり以下のような構造でfact関数が順に呼ばれるためです。





No.993

Re:return文の動作
投稿者---aka(2002/01/30 20:35:54)


ありがとうございます。理解できました。
図の説明がとても有難かったです。

これからも質問する時があると思いますので、その時は宜しくお願いします。
ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.16
Copyright(c) 2000-2002 TOMOJI All Rights Reserved