递归算法
来源:互联网 发布:视频监控网络服务器 编辑:程序博客网 时间:2024/06/05 11:55
1.什么是递归算法
任何调用自身的函数称为递归。用递归算法求解问题,要点在于递归函数调用自身去解决一个规模比原始问题小一些的问题。这个过程成为递归步骤。递归算法执行递归步骤,直至到达基本情况。
2.为什么要用递归算法
递归算法通常比循环迭代方法要更加简洁易懂,当任务能够被相似的子任务定义时,采用递归处理十分有效。
3.递归算法的基本格式
递归算法有两个要点,当编写递归算法是,其实就是在寻找着两个要点,并将它们编码实现:
递归步骤:这个要点就是寻找调用函数自身能够完成子任务的逻辑过程;
基本情况:就是找出递归调用不再执行的基本条件,这一点很重要,否则递归将永远执行下去。
例如:计算n! n>=0
//计算一个数的阶乘int Fact(int n){ //基本情形:当参数为0或1时,返回1 if(1 == n) return 1; else if (0 == n) return 1; //递归步骤,返回n*(n-1)! else return n*Fact(n-1);}其中,n=1或n=0,就是基本情形,因为n=0或n-1不满足n!=n(n-1)!的递归步骤,n(n-1)!就是递归步骤。记住并并能找出这两个要点,就能很好的记住递归算法的应用。
4.递归算法的缺点
递归算法的缺点是比较占用内存空间,每当调用一次递归步骤,就需要为新的函数副本分配空间。
5.递归算法的经典用例
斐波拉契数列、阶乘;
归并排序、快速排序;
二分查找;
树的遍历;
图的遍历:深度优先,广度优先;
分治算法;
汉诺塔
6.例子
汉诺塔问题:
有3根柱子和一些可以在柱子之间来回移动的不同大小的圆盘。开始时,所有的圆盘安装从小到大的次序自上而下叠放在一根柱子上,形成一个锥子型,要求把整叠圆盘移动到另一个柱子上,并且:
每次只能移动一个圆盘。
每次移动,只能移动柱子最上面的一个圆盘到另一根柱子。
任何时候不能出现大圆盘在小圆盘上方的情况。
递归实现
将源柱最上面的n-1个圆盘移动到辅助柱。
将第n个圆盘从源柱上移动到目标柱。
将辅助柱子的n-1个圆盘移动到目的柱。
源柱最上面n-1个圆盘的移动到辅助柱又可以认为是一个新的问题,并且可以用同样的方式解决。一旦能解决3个圆盘的汉诺塔问题,那么这个算法就可以求解任意数量圆盘的汉诺塔问题。
void TowersOfHanoi(int n, char frompeg, char topeg, char auxpeg) { //如果仅有一个圆盘,直接移动到目的柱 if (1 == n){ system.out.println("Move disk 1 from peg" + frompeg + "to peg" + topeg); return; } //利用C柱辅助,将A柱最上面的n-1个圆盘移动到B 柱 TowersOfHanoi(n-1, frompeg, auxpeg, topeg); //将余下的圆盘从A柱移动到C柱 system.out.println("move disk from peg "+frompeg + " to peg " + topeg); //利用A柱作为辅助,将B柱上的n-1个圆盘移动到C柱 TowersOfHanoi(n-1, auxpeg, topeg, frompeg);}给定一个数字,请用递归方法判断数组中的元素是否有序
int isArrayInSortedOrder(int[] A, int index){ if(A.length() == 1) return 1; return (A[index-1] <= A[index-2])?0:isArrayInSortedOrder(A, index-1);