递归最主要的两点:
(1)递归前进段
(2)边界条件
只要掌握好这两点,就能把问题简单化
引出几个递归的例子
1.求n! //n!=(n-1)!*n
#include<stdio.h>
int Fac(int n)
{
if(n==0)
{
return 1;
}
else
return Fac(n-1)*n;
}
int main()
{
int tmp=Fac(3);
printf("%d\n",tmp);
return 0;
}
2.求1~n之和 //Sum(n)=Sum(n-1)+n
#include<stdio.h>
int Sum(int n)
{
if(n==0)
{
return 0;
}
else
return Sum(n-1)+n;
}
int main()
{
int tmp=Sum(5);
printf("%d\n",tmp);
return 0;
}
3.求年龄问题
已知第一个人的年龄,以后每个人比前一个大两岁,求第n个人的年龄
#include<stdio.h>
int Age(int n)
{
if(n==1)
{
return 10;
}
else
return Age(n-1)+2;
}
int main()
{
int tmp=Age(5);
printf("%d\n",tmp);
return 0;
}
4.求斐波那契数列前n项
#include<stdio.h>
int Fabio(int n)
{
if(n==1 || n==2)
{
return 1;
}
else
return Fabio(n-1)+Fabio(n-2);
}
int main()
{
int tmp=Fabio(5);
printf("%d\n",tmp);
return 0;
}
5.汉诺塔
#include<stdio.h>
int g_count;
void Move(char x,char y)
{
g_count++;
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);//从a通过c移到b
Move(a,c);
Hanoi(n-1,b,a,c);
}
}
int main()
{
Hanoi(3,'A','B','C');
printf("%d\n",g_count);//移动的次数
return 0;
}
其实递归说白了就是自己调用自己,递归的调用是基于栈的。