【算法】汉诺塔问题

本文介绍了源于印度古老传说的汉诺塔问题,详细阐述了其规则及解决步骤。通过递归算法,展示了如何将n个圆盘从起始柱移动到目标柱,同时遵循每次只能移动一个圆盘和小圆盘在大圆盘之上的原则。文中给出了3个圆盘的移动次数,并指出移动n个圆盘至少需要2^n-1次操作。最后,提供了一个Go语言实现的汉诺塔问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,
// 其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,
// 移动过程中必须遵守以下规则:
// 1.每次只能移动柱子最顶端的一个圆盘;
// 2.每个柱子上,小圆盘永远要位于大圆盘之上;


// 对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:
// 1.将起始柱上的 n-1 个圆盘移动到辅助柱上;
// 2.将起始柱上遗留的 1 个圆盘移动到目标柱上;
// 3.将辅助柱上的所有圆盘移动到目标柱上。

// 汉诺塔问题中,3 个圆盘至少需要移动 7 次,移动 n 的圆盘至少需要操作 2^n-1 次

package main

import "fmt"

// 定义移动的次数
var a int = 1

func hanoi(num int, sou string, tar string ,aux string){
    // 如果盘子数只有一个直接移动到目标柱
    if num == 1 {
        fmt.Printf("第%d次从%s移动到%s\n",a,sou,tar)
        a++
    }else{
        // 调用hanoi函数将n-1个盘移动到辅助柱上
        hanoi(num-1,sou,aux,tar)
        fmt.Printf("第%d次从%s移动到%s\n",a,sou,tar)
        a++
        // 调用hanoi函数将辅助柱上n-1个盘子移动到目标柱
        hanoi(num-1,aux,tar,sou)
    }


}

func main(){
    var n int
    fmt.Printf("请输入圆盘的个数:")
    fmt.Scan(&n)

    fmt.Printf("您输入的圆盘个数是:%d\n",n)

    // 定义A为起始柱、B为目标柱、C为辅助柱
    hanoi(n,"A","B","C")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值