递归算法

来源:互联网 发布:四字网络流行语 编辑:程序博客网 时间:2024/06/06 18:38

在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。

如何快速正确的写出递归函数

写一个递归函数是非常程式化的东西,只要按照一定的规则来写,就可以很容易地写出递归函数。写递归函数有三步
①写出迭代公式;
②确定递归终止条件;
③将①②翻译成代码。
能用递归解决的问题通常具有两个特点:

1 有退出条件2 外层需要用到内层算出的结果(也可能是内层需要外层的计算结果,但比较少见)    最难的地方是找出外层利用内层结果的方法,这往往需要在思考问题的过程中发现规律,纸笔是不可缺少的。    另外退出条件需要拿捏准确,这也是一个容易出错的地方

递归算法的优缺点:

1优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

汉诺塔:递归程序示例代码:

时间复杂度计算汉诺塔问题是一个经典的“重复问题“(recurrent problem),解法也从中所知,最少移动步骤是2^n - 1。n个盘子,ABC三个地点,将A上的n个盘子移动到C上。最少的步骤是多少?AC[n] = AB[n-1] + AC[1] + BC[n-1]因为AC[n] = BC[n] = AB[n] = T(n)所以以上等式可以写成T(n) = T(n-1) + 1 + T(n-1)=2^1*T(n-1)+1=2^2*T(n-2)+1=......=2^n-1*T(n-(n-1))+1=2^n-1*T(1))+1,从而得到T(n) = 2^n - 1
我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:如果a只有一个圆盘,可以直接移动到c;如果a有N个圆盘,可以看成a1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:move(n, a, b, c)例如,输入 move(2, 'A', 'B', 'C'),打印出:A --> BA --> CB --> C
public class 汉诺塔递归 {    public static void main(String[] args) {        move(2,"A","B","C");    }    public static void move(int n,String a, String b,String c){        if (n ==1){            System.out.println (a + "--->"+c);            return;        }        move(n-1, a, c, b);        System.out.println  (a + "--->"+c);        move(n-1, b, a, c);    }}

递归,是一种解决方案,一种思想,将一个大工作分为逐渐减小的小工作,比如说一个人要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……以此类推的思考,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。

0 0