递归:自己调用自己。
按步前进;规模逐渐缩小。需要说明边界条件,返回值。
常用案例:
1.阶乘
递归:
int Fac(int n)
{
if(n==1||n==0)
return 1;
else
return Fac(n-1)*n;
}
循环:
int Fac(int n)
{
int tmp=1;
for(int i = 1; i <= n; i++ )
{
tmp*=i;
}
return tmp;
}
2.求前n项的和
递归
int Sum(int n)
{
if(n==0)
return 0;
else
return Sum(n-1)+n;
}
循化
int Sum(int n)
{
int tmp=0;
for(int i=0 ; i<=n ; i++)
tmp+=i;
return tmp;
}
3.Fibon数列
递归
int Fibon(int n)
{
if(n==1||n==2)
return 1;
else
return Fibon(n-1)+Fibon(n-2);
}
循环
int Fibon(int n)
{
int f1=1;
int f2=1;
int f3;
for(int i=0;i<=n;i++)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
4.汉诺塔
#include<stdio.h>
void Move(char x,char y)
{
printf("%c->%c\n",x,y);
}
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
Move(a,c);
}
else
{
Hanoi(n-1,a,c,b);
Move(a,c);
Hanoi(n-1,b,a,c);
}
}
int main()
{
Hanoi(2,'A','B','C');
}
当汉诺塔的盘数大于2时,调用Hanoi函数以实现将n-1个盘从b移动到c。比如当n=2时,A->B,这时给Hanoi传递参数时调整b与c的顺序,而Move移动时就把最上层的盘移动到b上了,Move(a,c)可以把a移动到b上,最后将a,b柱的位置调整,使得 Move(a,c)执行时将b上的盘移动到c。如图: