(python)经典的数学和逻辑谜题-汉诺塔

前言

        在贝纳雷斯的大寺庙里在标志着世界中心的圆顶下,有一块黄铜板,上面固定着三根钻石针,每根针高一肘,粗细如蜜蜂的身体.在其中一根针上,上帝在创世时放置了六十四个纯金的圆盘,最大的圆盘放在黄铜板上,其他的圆盘逐渐变小,直到最上面的一个.这就是布拉马之塔.日夜不停地,祭司们根据布拉马的固定和不变的法则,将圆盘从一根钻石针转移到另一根针上,值班的祭司每次只能移动一个圆盘,并且必须将该圆盘放在一根针上,使得它下面没有更小的圆盘.当这六十四个圆盘从上帝放置它们的针转移到其他针上时,塔、寺庙和婆罗门都将化为尘土,世界也将随着一声雷鸣而消失.

目录

特点

解决方法

代码

总结


特点

汉诺塔问题是一个经典的数学和逻辑谜题.

简单而深刻的规则

将所有的圆盘从一个柱子移动到另一个柱子,

在移动过程中必须遵循三个规则:

一次只能移动一个盘子;大盘子不能放在小盘子上面;只能使用汉诺塔原有的三根柱子.

递归结构

计算机科学中经典的递归例子

将大问题分解为小问题,然后通过解决小问题来解决大问题.

数学背景

可以通过数学归纳法证明

解决方法

​​​​
  1. 使用递归算法解决问题(将大问题分解为小问题,然后通过解决小问题来解决大问题)
  2. 数学归纳法 用数学方式进行形式化描述和解决对于具有n个盘子的汉诺塔问题,最少需要移动2^n - 1次。

代码

# 数学归纳法 移动2^n - 1次
def func_hanoi(n):
    if n == 1:
        return 1
    return 2 ** n - 1


def hanoi(n, source, target, auxiliary):
    global move_time
    move_time += 1
    print(hanoi_list)
    hanoi_list[["A", "B", "C"].index(source)] -= 1
    hanoi_list[["A", "B", "C"].index(target)] += 1
    # 递归终止条件
    if n == 1:
        # hanoi_list[0] = n
        # print(hanoi_list)
        print("Move disk 1 from", source, "->", target)
        return

    hanoi(n - 1, source, auxiliary, target)
    print("Move disk", n, "from", source, "->", target)
    hanoi(n - 1, auxiliary, target, source)


# 测试
n = 3  # 汉诺塔的盘子数量
move_time = 0
hanoi_list = [n, 0, 0]
hanoi(n, 'A', 'C', 'B')  # 'A'是起始柱子,'C'是目标柱子,'B'是辅助柱子
print(f"last {hanoi_list}")
print(func_hanoi(n))
print(f"移动次数为{move_time}次")

当N为3时,中间的变化过程如下 

[3, 0, 0]
[2, 0, 1]
[1, 1, 1]
Move disk 1 from A -> C
Move disk 2 from A -> B
[0, 1, 2]
Move disk 1 from C -> B
Move disk 3 from A -> C
[0, 2, 1]
[0, 1, 2]
Move disk 1 from B -> A
Move disk 2 from B -> C
[1, 0, 2]
Move disk 1 from A -> C
last [0, 0, 3]
7
移动次数为7

总结

        汉诺塔问题是一个抽象的数学问题. 然后,找到本质的规律时,解决办法却出乎预料的简单.方法是多样的,要么拆解问题,分解成更小,更容易处理的部分;要么总结归纳,发现 它的本质规律.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Marst·Zhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值