算法设计: 二、递归与分治策略 (1. Hanio塔问题)—— java实现 - 算法分析

Hanio塔问题

问题说明:将柱子A上的盘子,借助柱子B,移动到C柱子上,并保持与原来A柱子上的位置顺序一致。最顶部为1号。
在这里插入图片描述

解决该问题的方案,最经典的是递归思想。

一、Hanoi(汉诺塔)递归算法

Hanoi递归算法 源码:
/**
 * Hanoi(汉诺塔)递归算法
 */
package hanoi;

import java.util.Scanner;

public class Hanoi {
	
    public static int times;		//times记录移动的次数

    public static void main(String[] args) {
    	//定义A、B、C三根柱子
        char A = 'A';
        char B = 'B';
        char C = 'C';
        
        System.out.println("汉诺塔游戏");
        System.out.println("请输入盘子数:");
        
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        //调用汉诺塔
        hannoi(n, A, B, C);
        s.close();
    }
    
    /**
     * 汉诺塔演示
     */
    public static void hannoi(int n, char A, char B, char C){
    	
        if(n == 1){
            move(n, A, C);
        }else{
            //移动上一关的步骤移动到B
            hannoi(n-1, A, C, B);
            //把最大的盘子移动C塔
            move(n, A, C);
            //再把B上的上一关的盘子移动到C上就可以了
            hannoi(n-1, B, A, C);
        }
        
    }
    
    /**
     * 移动盘子,将disk号盘子从M移到N
     */
    public static void move(int disk, char M, char N ){
    	
        System.out.println("第"+(++times)+"次移动, 盘子"+disk+ "  "+M+"------->"+N);
    }
}

3、运行结果

在这里插入图片描述

4、算法分析

以 n=3 为例,实际移动步骤为:
在这里插入图片描述
可以看出三个明显的递归模块,递归实现的移动步骤为 1~7 的顺序。

函数调用三件事:

  1. 系统将所有实参指针、返回地址等信息传递给被调用函数;
  2. 在调用函数的方法栈中为被调用函数的局部变量分配储存区;
  3. 将控制转移到被调用函数入口。

函数返回三件事:

  1. 系统保存被调用函数的计算结果;
  2. 释放分配给被调用函数的数据区;
  3. 依照被调用函数保存的返回地址将控制转移到调用函数。
递归算法优缺点:
  • 优点:结构简单、可读性强、设计调试方便。
  • 缺点:频繁大量地调用自身函数和返回,CPU对执行程序的转移会耗费较长时间,并占用较多存储空间用于保存现场和转移信息。
时间复杂度:

Hanoi塔算法中,n个盘子的移动次数为2n-1,因此时间复杂度为 O( 2n ) 。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值