鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 天下有敌

Python汉诺塔程序怎么用迭代方式写出来?

[复制链接]
发表于 2020-6-18 15:19:57 From FishC Mobile | 显示全部楼层
100个最好用迭代,不要用递归,数字越大你电脑计算的时间也越长,递归和迭代的运行是有区别的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 09:47:29 | 显示全部楼层
本帖最后由 majian890324 于 2020-7-5 09:52 编辑
天下有敌 发表于 2020-6-11 10:10
你这个算的步数都是错的


刚看到这个帖子,怎么可能错呢,初始化层数是必须>=3,
我试了一下你的那个公式和我这个得出的结果是一样的,
如果只想要最后的结果就把print(j)的缩进前移一下就是最终的结果.

count = int(input("输入盘数,计算步数:"))
print(2**int(count)-1) # 楼主的公式

x = 3 # x是初始层数
j = 7 # j 是初始步数

while x < count :
    x += 1
    j = j*2 + 1
print(j)  # 我的循环


if (2**int(count)-1) == j:
        print('两个结果是一样的:YES')

else:
        print('两个结果是不一样的:NO')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 10:56:52 | 显示全部楼层
本帖最后由 青出于蓝 于 2020-7-5 11:17 编辑

[code]
count=0
def Hanoi(n,Start,Mid,Tar):
    global count
    if n==1:
        print("{}->{}".format(Start,Tar))#如果只有一个圆盘,可以直接放到目标柱
        count+=1
    else:
        Hanoi(n-1,Start,Tar,Mid)#如果不是只有一个圆盘,首先需要将n-1个圆盘放到辅助柱上
        count+=1
        print("{}->{}".format(Start,Mid))#将第n个圆盘放到目标柱子上
        Hanoi(n-1,Mid,Start,Tar)#然后将剩下的n-1个圆盘,从辅助柱子搬到目标柱子上
n=input("你希望的汉诺塔层数是:")
Hanoi(eval(n),"X","Y","Z")
print("一共搬运了:{}次。".format(count))
input()


        
[\code]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-5 11:58:24 | 显示全部楼层
majian890324 发表于 2020-6-11 09:41
这样算迭代吗?楼主只说要步数,没说要移动的方法,所以我这算不算投机取巧?

那我们两个都错了,小甲鱼和我们算的不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-5 12:06:19 | 显示全部楼层
青出于蓝 发表于 2020-7-5 10:56
[code]
count=0
def Hanoi(n,Start,Mid,Tar):

你这是递归,算大数据很慢。我的意思是用迭代,算的快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 14:30:32 | 显示全部楼层
本帖最后由 majian890324 于 2020-7-5 15:15 编辑
天下有敌 发表于 2020-7-5 11:58
那我们两个都错了,小甲鱼和我们算的不一样


那不能啊,我查了一下就是这样算呀?你把小甲鱼的代码贴上来看一下呗!
count = int(input("输入盘数,计算步数:"))
print(2**int(count)-1) # 楼主的公式

x = 3 # x是初始层数
j = 7 # j 是初始步数

while x < count :
    x += 1
    j = j*2 + 1
print(j)  # 我的循环


if (2**int(count)-1) == j:
        print('两个结果是一样的:YES')

else:
        print('两个结果是不一样的:NO')



#递归汉诺塔,有一共走了多少步

count1 = 0
def move(n,a,b,c):
    global count1
    if n==1:
        count1 += 1
        print('move', a, '-->', c)
    else:
        move(n-1,a,c,b)
        move(1,a,b,c)
        move(n-1,b,a,c)
move(count,'A','B','C')
print(count1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 15:03:13 From FishC Mobile | 显示全部楼层
小甲鱼的铁粉 发表于 2020-6-11 08:55
这样是迭代吗

这是递归,不是迭代
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 15:37:10 From FishC Mobile | 显示全部楼层
[code]def han(n):
    if n==1:
        return 1
    else:
        temp=1   
        while n>1:
            n=n-1
            temp*=2   
        return temp+1

print(han(100))[\code]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 15:37:43 From FishC Mobile | 显示全部楼层
def han(n):
    if n==1:
        return 1
    else:
        temp=1    
        while n>1:
            n=n-1
            temp*=2   
        return temp+1

print(han(100))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 15:39:41 From FishC Mobile | 显示全部楼层
天下有敌 发表于 2020-7-5 12:06
你这是递归,算大数据很慢。我的意思是用迭代,算的快

小甲鱼视频里好像也有用迭代写的代码吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 15:57:52 From FishC Mobile | 显示全部楼层
def han(n):
    if n==1:
        return 1
    else:
        temp=1    
        while n>1:
            n=n-1
            temp*=2
            #迭代完成后temp的值为初始temp*2**(n-1)   
        return temp+1
        #return的结果就是2**(n-1)+1,换算一下就是2**n-1,刚好n=1时,公式也成立
    #所以最终结果可以写成是2**n-1
        
print(han(100))
这样说应该解释明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 03:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表