【概述】
- 递归算法:一种通过重复将问题分解为同类的子问题而解决问题的方法。
- 适用问题:解决结构自相似的问题。即:构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。
- 特点:反复执行、结束反复执行的条件
- 缺点:占用大量内存且不易阅读
【两个问题】
- 递归边界条件(递归终止条件):确定递归到何时终止,或者说,直接有解的情况。
- 递归模式(递归体):大问题是如何分解为小问题的。
注:递归终止条件通常就是得出最小问题的解,并返回给他的调用者。
【间接递归与直接递归】
1.直接递归调用:就是在函数f中直接调用函数f本身
2.间接递归调用:就是在函数f1中调用另外一个函数f2,而该函数f2又调用了函数f1
【经典应用】
1.递归求和
void Sum(int n)
{
if(n>1)
return n+Sum(n-1);
else
return 1;
}
2.递归求阶乘
阶乘的递归公式:
int F(int n)
{
if(n==0)
return 1;
return n*F(n-1);
}
3.斐波那契数列递归实现
int Fibonacci(int n)
{
if(n==1)
return 1;
if(n==2)
return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
关于斐波那契数列:点击这里
4.汉诺塔问题的递归实现
#include<stdio.h>
void move(int n, char x, char y, char z)//将n个圆盘从x柱子上借助y柱子移动到z柱子上
{
if(n == 1)
printf("圆盘编号 %d :从 %c 移动到 %c\n",n,x,z);
else
{
move(n-1,x,y,z);
printf("圆盘编号 %d:从 %c 移动到 %c\n",n,x,z);
move(n-1,y,x,z);
}
}
int main()
{
int n;//n代表圆盘的个数
/*A,B,C分别代表三个柱子*/
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
printf("请输入圆盘的个数:");
scanf("%d",&n);
move(n,ch1,ch2,ch3);
return 0;
}
关于汉诺塔问题:点击这里
【例题】
1.普通
- 数的计算(洛谷-P1028):点击这里
同题:数的计数(信息学奥赛一本通-T1316):点击这里 - 放苹果(信息学奥赛一本通-T1206):点击这里
- 鸣人的影分身(信息学奥赛一本通-T1303):点击这里
- 进制转换(洛谷-P1017):点击这里
- Pell数列(信息学奥赛一本通-T1202):点击这里
- 黑白棋子的移动(信息学奥赛一本通-T1327):点击这里
- 判断元素是否存在(信息学奥赛一本通-T1211):点击这里
- 汉诺塔问题(信息学奥赛一本通-T1205):点击这里
- 分解因数(信息学奥赛一本通-T1200):点击这里
- 因子分解(信息学奥赛一本通-T1210):点击这里
- 分数求和(信息学奥赛一本通-T1209):点击这里
- 求最大公约数问题(信息学奥赛一本通-T1207):点击这里