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

 

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