递归算法例子

求解汉诺塔问题:

问题:
从左到右有 x、y、z 三根柱子,其中 x 柱子上面有从小叠到大的 n 个圆盘。现要求将 x 柱子上的圆盘移到 z 柱子上去。要求是,每次只能移动一个盘子,且大盘子不能被放在小盘子上面
解析:

  1. 把从小到大的 n-1 个盘子,从 x 移动到 y;
  2. 接着把最大的一个盘子,从 x 移动到 z;
  3. 再把从小到大的 n-1 个盘子,从 y 移动到 z。
    在这里插入图片描述
public static void main(String[] args) {
    String x = "x";
    String y = "y";
    String z = "z";
    hanio(3, x, y, z);
}
public static void hanio(int n, String x, String y, String z) {
    if (n < 1) {
        System.out.println("汉诺塔的层数不能小于1");
    } else if (n == 1) {
        System.out.println("移动: " + x + " -> " + z);
        return;
    } else {
        hanio(n - 1, x, z, y);
        System.out.println("移动: " + x + " -> " + z);
        hanio(n - 1, y, x, z);
    }
}

输出:
移动: x -> z
移动: x -> y
移动: z -> y
移动: x -> z
移动: y -> x
移动: y -> z
移动: x -> z

过程分析:
我们以 n = 3 为例,执行一下这段代码:

  • 在主函数中,执行了 hanio(3, “x”, “y”, “z”)。我们发现 3 比 1 要大,则进入递归体。分别先后执行了 hanio(2, “x”, “z”, “y”)、“移动: x->z”、hanio(2, “y”, “x”, “z”)。
  • 其中的 hanio(2, “x”, “z”, “y”),又先后执行了 hanio(1, “x”, “y”, “z”)、“移动: x->y”、hanio(1, “z”, “x”, “y”)。在这里,hanio(1, “x”, “y”, “z”) 的执行结果是 “移动: x->z”,hanio(1, “z”, “x”, “y”)的执行结果是"移动: z->y"。
  • 另一边,hanio(2, “y”, “x”, “z”) 则要先后执行 hanio(1, “y”, “z”, “x”)、“移动: y->z”、hanio(1, “x”, “y”, “z”)。在这里,hanio(1, “y”, “z”, “x”) 的执行结果是"移动: y->x",hanio(1, “x”, “y”, “z”) 的执行结果是 “移动: x->z”。

求解斐波那契数列:

斐波那契数列是:0,1,1,2,3,5,8,13,21,34,55,89,144……。
某个数等于它前面两个数的和;也就是 a[n+2] = a[n+1] + a[n]。至于起始两个元素,则分别为 0 和 1。
写一个函数,输入 x,输出斐波那契数列中第 x 位的元素。例如,输入 4,输出 2;输入 9,输出 21

public static void main(String[] args) {
    System.out.println(hanio(9));
}
public static int hanio(int n) {
    if(n==1){
        return 0;
    }else if(n==2){
       return 1;
    }else{
        int a =hanio(n-2)+hanio(n-1);
        return a;
    }
}


输出 :21
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值