滑稽蛋 发表于 2020-6-2 10:17:17

hanoi塔代码详解

本帖最后由 滑稽蛋 于 2020-6-2 10:54 编辑

def hanoi(n,x,y,z):
    if n == 1:
      print(x,'-->',z)
    else:
      hanoi(n-1,x,z,y)
      print(x,'-->',z)
      hanoi(n-1,y,x,z)


n = int(input('请输入你的数字:'))
hanoi(n,'x','y','z')


在这里我想不明白,他的判断是怎么结束的和n-1代表的是什么,不会是每次一定后剩下的盘子数吧


然后问个小问题我想应该是这样子的,就是在函数if判断语句里面的x,y,z换位置他只是一个名字换掉,我再外面给他赋予的值的位置是不会改变的,就好比这里的x,z,y赋值后就是x,y,z,然后我需要打印的就是不变的

Twilight6 发表于 2020-6-2 10:21:18

n - 1 是需要移动的盘子数量

滑稽蛋 发表于 2020-6-2 10:22:23

Twilight6 发表于 2020-6-2 10:21
n - 1 是需要移动的盘子数量

这样子的啊,那他是怎么判断结束的呢

Twilight6 发表于 2020-6-2 10:24:12

滑稽蛋 发表于 2020-6-2 10:22
这样子的啊,那他是怎么判断结束的呢

递归到最后 n == 1就到了 if 代码块 执行,if 语句的代码块里没有 递归了,所以此时结束,开始依次返回

Twilight6 发表于 2020-6-2 10:26:42

谈如何简单懒汉式理解汉诺塔
https://fishc.com.cn/thread-126371-1-1.html
(出处: 鱼C论坛)
你也可以去看看大佬写的帖子

滑稽蛋 发表于 2020-6-2 10:32:53

Twilight6 发表于 2020-6-2 10:24
递归到最后 n == 1就到了 if 代码块 执行,if 语句的代码块里没有 递归了,所以此时结束,开始依次返回

意思就是说,比如我输入的是2,判断2不等于1,进入else,也就是x-->y,2-1=1.第二次循环1 等于1,也就是x --> z,再1 - 1 = 0 ,第三次循环 0不等于1,也就是对应的y-->z,然后输出每次判断的结果是这样吧

Twilight6 发表于 2020-6-2 10:36:03

滑稽蛋 发表于 2020-6-2 10:32
意思就是说,比如我输入的是2,判断2不等于1,进入else,也就是x-->y,2-1=1.第二次循环1 等于1,也就是x ...

这个 不是 循环 是递归,你有点理解错了

假如你输入的是2,判断2不等于1 执行 else 代码块 进入递归

递归中 2-1 =1则 n = 1 if 再次判断正好符合条件进入 if 代码块

滑稽蛋 发表于 2020-6-2 10:46:25

Twilight6 发表于 2020-6-2 10:36
这个 不是 循环 是递归,你有点理解错了

假如你输入的是2,判断2不等于1 执行 else 代码块 进入递归
...

我的错,我的错,我搞混了,他是调用自己对哦

Twilight6 发表于 2020-6-2 10:47:46

滑稽蛋 发表于 2020-6-2 10:46
我的错,我的错,我搞混了,他是调用自己对哦

哈哈对哦,汉诺塔确实比较难 我当时消化了好久

滑稽蛋 发表于 2020-6-2 10:51:54

Twilight6 发表于 2020-6-2 10:47
哈哈对哦,汉诺塔确实比较难 我当时消化了好久

那么问题又来了{:10_277:},这里的xyz为什么要换位置呢

Twilight6 发表于 2020-6-2 10:54:26

滑稽蛋 发表于 2020-6-2 10:51
那么问题又来了,这里的xyz为什么要换位置呢

{:10_266:}

Twilight6 发表于 2020-6-2 10:54:59

滑稽蛋 发表于 2020-6-2 10:51
那么问题又来了,这里的xyz为什么要换位置呢

https://fishc.com.cn/thread-126371-1-1.html

看这个去理解为什么吧

滑稽蛋 发表于 2020-6-2 10:55:27

Twilight6 发表于 2020-6-2 10:54


哈哈,是和我上面说的差不多的嘛

Twilight6 发表于 2020-6-2 10:56:16

滑稽蛋 发表于 2020-6-2 10:55
哈哈,是和我上面说的差不多的嘛

差不多吧 换位置来模拟移动

滑稽蛋 发表于 2020-6-2 10:58:35

Twilight6 发表于 2020-6-2 10:56
差不多吧 换位置来模拟移动

就是因为你不能重新输入,所以要改变函数参数的位置来模拟移动是吧

Twilight6 发表于 2020-6-2 11:00:07

滑稽蛋 发表于 2020-6-2 10:58
就是因为你不能重新输入,所以要改变函数参数的位置来模拟移动是吧

嗯我们只需要输入一次,后面的让程序来走出最优的移动方法

滑稽蛋 发表于 2020-6-2 11:01:49

Twilight6 发表于 2020-6-2 11:00
嗯我们只需要输入一次,后面的让程序来走出最优的移动方法

小甲鱼留的题目我感觉有点为难我们新手了,这个上面的第一天这些要怎么输出,就有点懵

Twilight6 发表于 2020-6-2 11:02:45

滑稽蛋 发表于 2020-6-2 11:01
小甲鱼留的题目我感觉有点为难我们新手了,这个上面的第一天这些要怎么输出,就有点懵

哈哈哈哈   没事难为我们也是种锻炼

滑稽蛋 发表于 2020-6-2 15:00:57

Twilight6 发表于 2020-6-2 11:02
哈哈哈哈   没事难为我们也是种锻炼

我觉得这个题目,没有一点小提示我是做不出来的
页: [1]
查看完整版本: hanoi塔代码详解