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