有些问题,可以用递推,也可以用递归的方法解决。
递推:从一个已知的事实出发,按一定规律推出下一个事实,再从已知的新的事实,推出下一个新的事实.
例 用递推法求n! ,即从1开始, 乘2, 乘3....一直到n
#include<stdio.h>
void main( )
{ int i, s=1;
for(i=1;i<=5;i++)
s=s* i;
printf(“s=%d\ n”,s);
}
递归:在函数调用自身时,要给出结束递归的条件。
先回推再递推
如:n!,
5!=5 × 4!
4!=4 × 3!
3!=3 × 2!
2!=2 × 1!
1!=1
0!=1
{ 1 (n=0,1)
n!= {
{ n*(n-1)! (n>1)
#include<stdio.h>
voidmain()
{float fac(int n);
int n; float y;
printf("Input a integernumber:");
scanf("%d",&n);
y=fac(n);
printf("%d! =%15d",n,y);
}
floatfac(int n)
{float f;
if(n<0) printf("n<0,data error!");
else if(n==0||n==1) f=1;
else f=fac(n-1)*n;
return(f);}
算法分析——Hanoi塔问题
十九世纪未,欧洲珍奇商店出现一种汉诺塔游戏,推销材料介绍说:古代印度布拉玛庙里的僧侣们正在玩这种游戏,如果游戏结束,世界未日即来临。是一个只能用递归方法解决的问题。
规则及分析:
n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。
共有三根针,n个盘子由A移到C,需移动的次数是2n -1, 若64个盘子移动的次数为:
264 - 1=18, 446, 744, 073, 709, 551, 600
一年的秒数是:365 x 24 x 60 x 60=31536000
18446744073709511600÷31536000
=58494217355年
即:5849亿年, 从能源角度推算, 太阳系寿命只有150亿年
方法与步骤
将A上n-1个盘子借助C移到B。
把A上剩下一个盘子送到C
将n-1个盘子从B借助A移到C
简化实例:将A上3个盘子移到C步骤:1. A上两个盘子借助C移到B
2. A上最后一个盘子移到C (可直接完成)
3. B上两个盘子借助A移到C
第一步进一步分解:
1.1 A上一个盘子从AC
1.2 A上一个盘子从AB
1.3 C上一个盘子从CB
第三步进一步分解:
3.1 B上一个盘子从BA
3.2 B上一个盘子从BC
3.3 A上一个盘子从AC
共移动7步:23-1次
所以,n个盘要移动2n-1次
步骤1和3都是将n-1个盘子从一个针移到另一个针上(n>1时),这是一个递归的过程;方法一样,只是针的名称不同而已,为使问题一般化,将步骤1和3表示为:将one 针上的n-1个盘子移到two针,借助 three针,只是对应关系不同。
第一步对应关系:one A two B three C
第三步对应关系:one B two C three A
将1个盘子从一个针上移到另一针上。
因此,可以用两个函数分别实现上面两类操作,用hanoi函数实现第一类操作,用move函数实现第2类操作。
hanoi(n,one,two,three) 将n个盘从 one → three借助two
move(x,y) 将1个盘从x → y座,x、y根据情况取代ABC座中的1个。
#include <stdio.h>
void main()
{ void hanoi(int n,char one,char two,char three);
int m;
printf("Input the number of diskes:");
scanf("%d",&m);
printf("The step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');}
void hanoi(int n,char one,char two,char three)
{void move(char x, char y);
if(n==1) move(one,three);
else { hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}}
void move(char x, char y)
{ printf("%c--->%c\n",x, y); }