C語言基礎 -45 函數_使用遞歸解決階乘與斐波那契問題

book@100ask:~/C_coding/CH02$ cat fun.c
#include <stdio.h>
#include <stdlib.h>

int func(int n)
{
	if(n < 0)
		return -1;
	if(n == 0 || n == 1)
		return 1;
	return n * func(n - 1);
}

int main()
{
	int n;
	int res;

	scanf("%d",&n);

	res = func(n);

	printf("%d! = %d\n",n,res);
}
book@100ask:~/C_coding/CH02$ make fun
cc     fun.c   -o fun
book@100ask:~/C_coding/CH02$ ./fun
-3
-3! = -1
book@100ask:~/C_coding/CH02$ ./fun
0
0! = 1
book@100ask:~/C_coding/CH02$ ./fun
4
4! = 24

如果計算3!,則第一次調用,返回3 * f(2),並壓棧

                                                            爲了求f(2),需要第二次調用,返回2*f(1),並壓棧

                                                                                                                        爲了求f(1),需要第三次調用,並返回1

                                                            接着,將2*f(1)=2的結果2返回第二次調用的位置,並出棧

將3*f(2)=6的結果6返回第一次調用的位置,並出棧

二叉樹/漢諾塔遊戲等,就適合用遞歸算法。

book@100ask:~/C_coding/CH02$ cat fib.c
#include <stdio.h>

int fb(int n)
{
	if(n < 1)
		return -1;
	if(n == 2 || n == 1)
		return 1;
	if(n > 2)
		return fb(n - 1) + fb(n - 2);
}

int main()
{
	int n,res;
	scanf("%d",&n);
	res = fb(n);
	printf("fib(%d) =%d\n",n,res);
}
book@100ask:~/C_coding/CH02$ make fib
cc     fib.c   -o fib
book@100ask:~/C_coding/CH02$ ./fib
3
fib(3) =2
book@100ask:~/C_coding/CH02$ ./fib
2
fib(2) =1
book@100ask:~/C_coding/CH02$ ./fib
1
fib(1) =1
book@100ask:~/C_coding/CH02$ ./fib
4
fib(4) =3
book@100ask:~/C_coding/CH02$ ./fib
7
fib(7) =13
book@100ask:~/C_coding/CH02$ ./fib
6
fib(6) =8
book@100ask:~/C_coding/CH02$ ./fib
8
fib(8) =21

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章