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