递归算法
一、概念
递归过程一般通过函数或子过程来实现。递归算法:在函数或子过程的内部,直接或间接地调用自己的算法。
二、条件
1.能自己调用自己;
2.调用自己时问题规模有规律的递减;
3.递归关系(求解的递归步骤、函数公式)
4.出口(递归存在终止状态)
三、时间复杂度
【T(n)=o(f(n))】他表示,随问题规模n的增大,算法的执行时间增长率和f(n)增长率有成正比,这称作算法的渐进时间复杂度。
四、经典案例
汉诺塔hanoi
相传在古代印度的 Bramah 庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子的话,按照上述规则将64只盘子从一个柱子移至另一个柱子上,所需时间约为5800亿年。
算法分析:
假如有三个盘子,要将他们从第一个柱子移到第三个柱子。应该把上面两个盘子看成一个盘子。这样子我们就可以把三个盘子的问题,转化成两个盘子的问题,使这个问题变得简单一些。先将看成整体的盘子移到第二柱,再将最后一个盘子移到第三柱,然后再将第二柱上的盘子用同样的方法拆分,最终全部移到第三柱。如果有更多的盘子也可以用这种方法将它们拆分成最底下的盘子和剩余的盘子。按照同样的方法,把它们移到第三柱上。
参考程序:
- #include
#include
using namespace std;
void hanoi(int n,char a,char b,char c) //用b柱作为协助过渡,将a柱上的(n)移到c柱
{
if(n==1) //如果n=1,则输出。
{
printf("%c -> %c\n",a,c);
}
else
{
hanoi(n-1,a,c,b); //用c柱作为协助过渡,将a柱上的(n-1)片移到b柱上
printf("%c -> %c\n",a,c);
hanoi(n-1,b,a,c); //用a柱作为协助过渡,将b柱上的(n-1)移到c柱上
}
}
int main()
{
hanoi(2,‘a’,‘b’,‘c’);
return 0;
}
心得
通过学习递归算法,就可以轻轻松松的得出解决汉诺塔问题的全过程。老师之前让我们自己在电脑上玩过汉诺塔游戏,我们大部分同学玩到四个盘子的时候,就全军覆没了。我们将盘子移来移去,始终是竹篮打水一场空。如果没有来到这个编程的夏令营,也许汉诺塔这个问题我始终都不能通关。也让我认识到编程不仅能扩宽我们的视野,开发我们的头脑,还能丰富我们的生活,让我们生活更加有趣。(而且还能在游戏中开gua)