递归算法

来源:互联网 发布:python wind 15分钟 编辑:程序博客网 时间:2024/06/07 19:20

概述

程序调用自身的编程技巧称为递归( recursion),通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归有直接递归和间接递归。

直接递归:函数在执行过程中调用本身。
间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。

递归算法的特性:

(1)必须有可最终达到的终止条件,否则程序将陷入无穷循环;

(2)子问题在规模上比原问题小,或更接近终止条件;

(3)子问题可通过再次递归调用求解或因满足终止条件而直接求解;

(4)子问题的解应能组合为整个问题的解。

(5)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。通常用递归方法的运行效率不高。

求n的阶乘

public static int fact(int n) {        if (n == 0 || n == 1) {            return 1;        } else {            return n * fact(n - 1);        }    }

Fibonacci数列

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

public static int fibonacci(int n) {        if (n == 0 || n == 1) {            return n;        } else {            return fibonacci(n - 1) + fibonacci(n - 2);        }    }

汉诺塔问题

汉诺塔问题是指有三根杆子A,B,C。A杆上有若干穿孔圆盘,盘的尺寸由下到上依次变小。要求把所有圆盘从A杆上移到C杆上,每次只能移动一个圆盘,大的圆盘不能叠在小的圆盘上面。求最少要移动多少次?示意图如下:

这里写图片描述

思路:首先把上面n-1个盘子移动到柱子B上,然后把最大的一块放在C上,最后把B上的所有盘子移动到C,一层层递归得到结果。

public static void hannoi(int n, char a, char b, char c) {        if (n == 1) {            System.out.println("Move " + n + " from " + a + " to " + c);        } else {            hannoi(n - 1, a, c, b);            System.out.println("Move " + n + " from " + a + " to " + c);            hannoi(n - 1, b, a, c);        }    }
0 0