所谓递归,我个人理解就是自己调用自己
递归有三个条件:
1、前进(规模缩小)
2、边界条件
3、返回段
下面我们通过一个函数举例:
int Age(int n)
{
int tmp;
if(n == 1)
tmp = 10;
else
tmp = Age(n-1)+2;
return tmp;
}
这段代码是计算关于第n个人的年龄的递归算法
如果将其写成循环的写法,就是下面的代码
int Age1(int n)
{
int i;
for(i = 0; i < n;i+=2);
return i;
}
貌似看起来更简单了一些,这确实,很多时候循环的写法比递归更容易让人理解,而且比递归要简单很多,那为什么我们还是要学习递归算法呢?当然是因为递归算法有他的特点和好处,我们通过下面这个题目来仔细了解一下递归的有点。
相传印度有个古老的传说:在一座庙里有三根宝石针,其中一根上面穿了64个大小不一的金片,就是所谓的汉诺塔。然后有这样的规则:一次只移动一片,不管在哪根针上,小片必须在大片上面。只要将64片金片移动到另一根银针上,有小到大排列,世界就会在一声霹雳中毁灭。
汉诺塔是个悲伤的故事,那我们思考一下如何用递归解决汉诺塔问题呢?
首先我们肯定要定义三个宝石针:
void Hanoi(int n,char a,char b,char c)
其次当银针上的金片数量先从一开始:
if(n == 1)
{
Move(a,c);
}
我们就可以直接让其返回到目标位置。
其次每次增加我们都可以让n-1个金片移动到目标位置,其次再按顺序将最后一个移到目标位置
完整代码如下:
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);
}
}
相反,如果使用循环写就会十分麻烦,各位有兴趣可以试着用循环写一下,感受一下。