n=5
c=age(3)+2 age函数 n=4
c=age(1)+2 age函数 n=2
c=age(2)+2 age函数 n=3 c=10 age函数 n=1
age(1)=10 age(2)=12 age(3)=14 age(4)=16 age(5)=18 18
例7.7 用递归方法求n!。 解题思路:
求n!可以用递推方法:即从1开始,乘2,再乘3??一直乘到n。
递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!。 例7.7 用递归方法求n!。 解题思路:
求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4?,1!=1 可用下面的递归公式表示: #include
{int fac(int n); int n; int y;
printf(\ scanf(\ y=fac(n);
printf(\ return 0; }
int fac(int n) {
int f;
if(n<0) printf(\ else if(n==0 | | n==1)
f=1;
else f=fac(n-1)*n; return(f); }
注意溢出 fac(5)
输出fac(5) main f=fac(4)×5 fac函数 n=5
f=fac(3)×4 fac函数 n=4
f=fac(1)×2 fac函数 n=2
f=fac(2)×3 fac函数 n=3 f=1
fac函数 n=1 fac(1)=1 fac(2)=2 fac(3)=6 fac(4)=24 fac(5)=120 120
例7.8 Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动一盘子的步骤。 解题思路:
要把64个盘子从A座移动到C座,需要移动大约264 次盘子。一般人是不可能直接确定移动盘子的每一个具体步骤的
老和尚会这样想:假如有另外一个和尚能有办法将上面63个盘子从一个座移到另一座。那么,问题就解决了。此时老和尚只需这样做: 解题思路:
(1) 命令第2个和尚将63个盘子从A座移到B座
(2) 自己将1个盘子(最底下的、最大的盘子)从A座移到C座 (3) 再命令第2个和尚将63个盘子从B座移到C座 A B
C ……
将63个从A到B 第1个和尚的做法 A B C
将63个从A到B 第1个和尚的做法 A B C
将1个从A到C 第1个和尚的做法 A B C
将1个从A到C 第1个和尚的做法 A B C
将63个从B到C 第1个和尚的做法 A B C
将63个从B到C 第1个和尚的做法 A B C ……
将62个从A到C 第2个和尚的做法 A B C
将62个从A到C 第2个和尚的做法 A B C
将1个从A到B
第2个和尚的做法 A B C
将1个从A到B 第2个和尚的做法 A B C
将62个从C到B 第2个和尚的做法 A B C
将62个从C到B 第2个和尚的做法 第3个和尚的做法 第4个和尚的做法 第5个和尚的做法 第6个和尚的做法 第7个和尚的做法 ……
第63个和尚的做法
第64个和尚仅做:将1个从A移到C A B C
将3个盘子从A移到C的全过程 将2个盘子从A移到B A B C
将3个盘子从A移到C的全过程 将2个盘子从A移到B A B C
将3个盘子从A移到C的全过程 将1个盘子从A移到C A B C
将3个盘子从A移到C的全过程 将1个盘子从A移到C
A B C
将3个盘子从A移到C的全过程 将2个盘子从B移到C A B C
将3个盘子从A移到C的全过程 将2个盘子从B移到C A B C
将2个盘子从A移到B的过程 将1个盘子从A移到C A B C
将2个盘子从A移到B的过程 将1个盘子从A移到C A B C
将2个盘子从A移到B的过程 将1个盘子从A移到B A B C
将2个盘子从A移到B的过程 将1个盘子从A移到B A B C
将2个盘子从A移到B的过程 将1个盘子从C移到B A B C
将2个盘子从A移到B的过程 将1个盘子从C移到B A B C
将2个盘子从B移到C的过程