汉诺塔的编程实现与人生思考

写这个的由来

今天上拓展运动体育课,老师组织了这个活动,虽然最后我们成功完成了还取得了第一名的好成绩,但是我想到去年老师讲Python的时候我感觉这个题很抽象,就没好好去思考这个问题了,然后今天感觉还是思考一下吧,锻炼下思维顺便弥补以前的过错哈哈哈。

在这里插入图片描述

汉诺塔介绍

在这里插入图片描述

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

4399游戏链接:http://www.4399.com/flash/676_1.htm

相关预言介绍

在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31557600秒,计算一下可知,需要移动 18446744073709551615 次

这表明移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.42亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。

二层A–>C运算步骤

A-->B
A-->C
B-->C

三层A–>C运算步骤

A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C

最短移动步数

一个盘子要移动1步

二个盘子要移动3步

三个盘子要移动7步

四个盘子要移动15步

五个盘子要移动31步

六个盘子要移动63步

七个盘子要移动127步

运算规律

通过最短步骤可以看出来,下一次的次数等于上一次次的运动次数的二倍加一,即得到递推公式

f(n) = 2*f(n-1)+1 (n>1且n∈N*)

大家想一想为什么会这样呢?

你想移动七层的首先需要构造出来六层,然后相当于把前六层从A移动到B,然后再把最后一层的一块放到C,然后再把六层从B移动到C,其实相当于把六层从A到B的逆运算。所以步骤就是2*f(6) +1

这是三阶的运算步骤,以这一行为分割线,上下两坨为逆运算,上面的一坨是把二阶的从A到B,下面一坨是把二阶从B到C,中间分割线是把第三层从A到C
在这里插入图片描述

操作的思路

三层的就没什么好说的了,是固定的,我们从四层开始谈起。

如果想把A的四层移动过去,首先应该在B构造一个三层出来,然后把第四层移动到C,然后把B中的三层再移动到C,相当于把逆运算

五层六层也是同理的,就是步骤多了点,但是思想是一样的

三层的A到B步骤是这样的

A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B

在这里插入图片描述

三层的B到C步骤是这样的

B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C

在这里插入图片描述

核心之处

其实,如果你看了上面我说的,你应该能感觉出来,核心应该是把n-1层移动到B还是C,答案肯定是B,但是我们上面给出的步骤是把n层从A移动到C,因此,每次的结果都不能被下一次结果所利用,我们应该得到n-1层从A移动到B是一个什么样的规律,但是真的是这样吗?我很快就推翻了我的观点。

大家想想,为什么你的三阶可以落在C呢?还是不是因为你的第一步?因为第一步不同,导致最后n-1落座的位置不同,其实也就是B和C的位置不一样罢了,互换一下位置不就好了?也就是说,n-1层A到C和A到B的步骤其实是一样的,只不过是就是把B换成C,把C换成B而已,如果你听不懂我在说什么,ok没关系,给你一张图直观感受

在这里插入图片描述

然后另外一个核心就是n-1阶的A到B与n-1阶的B到C是把AC互换,其实我们就能得到递推关系了:

n-1阶的A到B是把n-1阶A到C的BC互换

n-1阶的B到C是把n-1阶的A到B的AC互换

Python实现代码

先看前两层

# 一层的
def first():
    a = [1]
    b = []
    c = []
    return [['a','c']]
# 两层的
def second():
    a = [2,1]
    b = []
    c = []
    # 结果应该是[['a','b'],['a','c'],['b','c']]
    first_data = first()
    first_data_copy = [i.copy() for i in first_data.copy()]
    result = []
    for i in first_data_copy:  # 将bc互换
        if i[0]=='b':
            i[0] = 'c'
        elif i[0]=='c':
            i[0] = 'b'
        if i[1]=='b':
            i[1] = 'c'
        elif i[1]=='c':
            i[1] = 'b'
    result += first_data_copy  # 前半段
    result.append(['a','c'])
    front_data_copy_copy = [i.copy() for i in first_data_copy.copy()]
    front_data_copy_copy.reverse()
    for i in front_data_copy_copy:  # 将ac互换
        i[0],i[1] = i[1],i[0]
        if i[0]=='a':
            i[0] = 'c'
        elif i[0]=='c':
            i[0] = 'a'
        if i[1]=='a':
            i[1] = 'c'
        elif i[1]=='c':
            i[1] = 'a'
    result += front_data_copy_copy  # 后半段
    return result
print(second())

整体代码

def get_n(n):
    if n==1:
        return [['a','c']]
    front_data = get_n(n-1)
    front_data_copy = [i.copy() for i in front_data.copy()]
    result = []
    for i in front_data_copy:  # 将bc互换
        if i[0]=='b':
            i[0] = 'c'
        elif i[0]=='c':
            i[0] = 'b'
        if i[1]=='b':
            i[1] = 'c'
        elif i[1]=='c':
            i[1] = 'b'
    result += front_data_copy  # 前半段
    result.append(['a','c'])
    front_data_copy_copy = [i.copy() for i in front_data_copy.copy()]
    front_data_copy_copy.reverse()
    for i in front_data_copy_copy:  # 将ac互换
        i[0],i[1] = i[1],i[0]
        if i[0]=='a':
            i[0] = 'c'
        elif i[0]=='c':
            i[0] = 'a'
        if i[1]=='a':
            i[1] = 'c'
        elif i[1]=='c':
            i[1] = 'a'
    result += front_data_copy_copy  # 后半段
    return result
print(get_n(5))

人生感悟

人与自然是一体的,我们生活中几乎到处都是规律,包括斐波那契数列可以使用矩阵运算快速求出,难道我们的世界真的是程序设计好的?在我学习编程的时候发现斐波那契数列可以使用矩阵进行计算,也可以使用杨辉三角计算,我感觉,哇!大自然好神奇!

斐波那契数列是从生活中总结得到规律
矩阵运算得到斐波那契数列是已经存在这个矩阵了,我们后面找到了而已。
但是这个汉诺塔是生活现象,然后得到了数学证明,真的好奇妙,只可意会不可言传

如果是我们的世界真的是程序设计的话,那为什么我有我的意识?开始我感觉是玩家想操控我的时候再来控制我,不想操控我的时候就不来控制我,后来想了想,不太对,因为我下意识的把我们的世界认为成了多人联机世界,应该是一个单机世界,主角只有一个。。。他在我们的世界里可能是很有名的一个人,也可能是默默无名的一个人,也可能这个人已经死了,也可能是真人已经死了,也可能是真人人还没开始游戏,但是无论如何他操控的对象的行为受我们世界的法律约束,所以不能随意破坏。那我们创造的但单机游戏世界呢?他们也会有这些思考吗?好的我就说这么多啦!

这些思考也就是想着玩玩吧,我并不觉得这种想法很荒诞,但无论我是不是游戏中的角色都不重要了,因为我就是我,我要活好自己的人生,一直去思考这个问题就是浪费时间了,没有必要,但我们生活中存在规律是真的,也希望君与我能有善于发现规律的慧眼,我开始准备朋辈导师的上课讲义了,下一篇博客再见❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

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

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

打赏作者

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

抵扣说明:

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

余额充值