一、递归算法
1. 递归的简单定义
递归是指在定义自身的同时又出现了对自身的应用。如果一个函数在其定义体内直接调用自己,则称为递归函数(其中有直接递归函数和间接递归函数的区别)
2. 递归定义的数学函数
例如 二阶斐波那契(Fibonacci)数列定义如下
F[n]=F[n-1]+F[n-2] (n>=2,F[0]=0,F[1]=1)
二、递归算法解决汉诺塔问题
三个塔为A、B、C塔,将塔A的所有盘移动到C盘去
只考虑3个盘即n=3的情况下:
从塔顶开始排序
必须将底盘即第3个盘(最下面的、最大的盘)盘3先移到C盘去,就得先把它头上的所有盘(视作一个整体)移动到B盘去。最后再将盘3移到盘C去此步尚未完成
则 问题 进入到(重复调用自己)
将盘1盘2移动到B盘去,必须把最大的盘2移到B盘去,就得先把它头上所有的盘(此刻为盘1)移动到C盘去。最后再将盘2移到B盘,盘1从C盘移到B盘此步尚未完成
则 问题 进入到(重复调用自己)
将盘1移动到C盘去,发现它头上没有盘了,可以直接移动。则此步完成,而这一步属于上一步,此步的完成作为一个返回值(也是整个递归的终止条件,开始返回)
回到上一步即第二步,第二步有两个步骤,它的第一个步骤已经成功,进行它的第二步,此后第二步本身也成功,此步的成功又返回值它的上一步第一步,同理,第一步也成功了
最终实现了盘3在C盘底部,盘1,盘2在B盘的目的。
同理,再将塔B所有的盘按要求移动到C盘去。
其实上述步骤也只是全过程的一个步骤,我们研究n个盘的问题,以最下面的盘为研究对象,重复调用这个”移动盘的函数“,直到最下面的盘就是盘1的时候,目的就达到了
在上面的过程中经历了一个递归调用的过程,有必要的终止条件,是一种分而治之、化繁为简的过程,易于分析不过时空效率低下