汉诺塔问题实验报告

汉诺塔问题

问题描述

有 A,B,C 三根柱子,A 上面有 n 个盘子,我们想把 A 上面的盘子移动到 C 上,但是要满足以下三个条件:

每次只能移动一个盘子;
盘子只能从柱子顶端滑出移到下一根柱子;
盘子只能叠在比它大的盘子上。

解题思路

运用到递归与分治

假设 n = 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;

如果 n = 2 呢?这时候我们就要借助 B 了,因为小盘子必须时刻都在大盘子上面,共需要 4 步。

如果 n > 2 呢?思路和上面是一样的,我们把 n 个盘子也看成两个部分,一部分有 1 个盘子,另一部分有 n - 1 个盘子。

算法思想

  • n = 1 时,直接把盘子从 A 移到 C;
  • n > 1 时,
    先把上面 n - 1 个盘子通过C从 A 移到 B(子问题,递归);
    再将最大的盘子从 A 移到 C;
    再将 B 上 n - 1 个盘子通过A从 B 移到 C(子问题,递归)。

代码

package com.hillky.mianshi6;

import java.util.List;
import java.util.Scanner;

public class m0806 {

    public static void Hanoi(int n, char A, char B, char C)
    {
        if (n == 1)
            //从A移动到C
            Move(1, A, C);
        else
        {
            //开始递归,先将n-1个东西从A通过C移动到B
            Hanoi(n - 1, A, C, B);
            //将第n块从A移动到C
            Move(n, A, C);
            //下一步递归,先将n-1个东西从B通过A移动到C
            Hanoi(n - 1, B, A, C);
        }
    }

    public static void Move(int n, char A, char B)
    {
        System.out.println("number "+n+":"+A+" ---> "+B);
    }

    public static void main(String[] args) {
        char	X = 'A';
        char	Y = 'B';
        char	Z = 'C';
        int		n;
        for (int i = 2; i < 8; i++) {
            System.out.println("盘子个数为: "+i);
            Hanoi(i,X,Y,Z);
            System.out.println("===================");
        }

    }

}

结果截图

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。下面是针对递归算法解决汉诺塔问题实验报告,包括测试分析与总结。 ## 一、实验目的 本次实验旨在通过编写递归算法解决汉诺塔问题,掌握递归的思想与算法,并对递归算法进行测试分析,总结递归算法的优缺点。 ## 二、实验内容 ### 1. 算法思想 汉诺塔问题是一个经典的递归问题,它描述了如何将 $n$ 个盘子从一根柱子移动到另一根柱子,其中有一个中转柱子。要求每次只能移动一个盘子,并且大盘子不能放在小盘子上面。 递归解法如下: - 将 $n-1$ 个盘子从起始柱子移动到中转柱子; - 将第 $n$ 个盘子从起始柱子移动到目标柱子; - 将 $n-1$ 个盘子从中转柱子移动到目标柱子。 这样,问题就被拆分为了三个子问题,每个子问题都可以看作是一个更小的汉诺塔问题。因此,可以通过递归调用自身来解决整个问题。 ### 2. 算法实现 基于上述算法思想,我们可以编写如下的递归函数: ```python def hanoi(n, start, target, auxiliary): if n == 1: print(f"Move disk from {start} to {target}") else: hanoi(n-1, start, auxiliary, target) print(f"Move disk from {start} to {target}") hanoi(n-1, auxiliary, target, start) ``` 其中,`n` 表示盘子的数量,`start` 表示起始柱子,`target` 表示目标柱子,`auxiliary` 表示中转柱子。 ### 3. 算法测试 为了测试上述算法的正确性,我们可以分别测试不同数量的盘子时,算法的输出是否符合预期。 例如,当盘子数量为 3 时,算法的输出应该为: ``` Move disk from A to C Move disk from A to B Move disk from C to B Move disk from A to C Move disk from B to A Move disk from B to C Move disk from A to C ``` 当盘子数量为 4 时,算法的输出应该为: ``` Move disk from A to B Move disk from A to C Move disk from B to C Move disk from A to B Move disk from C to A Move disk from C to B Move disk from A to B Move disk from A to C Move disk from B to C Move disk from B to A Move disk from C to A Move disk from B to C Move disk from A to B Move disk from A to C Move disk from B to C ``` 通过实际测试,我们可以发现,上述算法的输出符合预期。 ### 4. 算法分析 递归算法的时间复杂度为 $O(2^n)$,空间复杂度为 $O(n)$。由于递归算法会频繁地进行函数调用,因此在数据量较大时,递归算法的效率较低,容易出现栈溢出等问题。 ## 三、实验总结 通过本次实验,我们了解了递归算法的思想与实现,并通过针对汉诺塔问题的递归实现,加深了对递归算法的理解。同时,我们也意识到递归算法的缺点,需要在实际应用中谨慎选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值