递归算法

在数学上,关于递归函数的定义如下:对于某一函数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 --> B
A --> C
B --> 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值