2024-01-06 11:28:26 | 我爱编程网
仔细看一下 5-7行调用 move 时候的参数顺序, 不是你说的那样没有变:
#5 的含义是将 A 上的前 n-1 个移动到 B
#6 : 将 A 最后一个移动到 C
#7: 将 B 上的 n-1 (即#5 从 A 移动过来的 n-1) 个移动到 C
python汉诺塔非递归,运用list和function知识的解答
无论stack还是recursion都是从汉诺塔的原理去解决问题,但如果已经想清楚汉诺塔的原理,其实只用把答案print出来就行了
先找规律:
一层:A-->C
两层:A-->B
-------
A-->C
-------
B-->C
三层:A-->C
A-->B
C-->B
-------
A-->C
-------
B-->A
B-->C
A-->C
注意到n层汉诺塔有(2**n) - 1 个步骤,而中间的一步(两个分割线之间)都是“A-->C”,中间的这一步将这一层汉诺塔的解分为上下两个部分
仔细观察,上面一部分是将上一层的解中所有的B,C交换,下面一部分是将上一层的解中所有的A,B交换
例如第二层是:
A-->B
A-->C
B-->C
第三层上部分就将第二层的解的C换成B,B换成C,即得出:
A-->C
A-->B
C-->B
第三层下部分就将第二层的解的A换成B,B换成A,即得出:
B-->A
A-->C
C-->B
这个规律同样适用于第一层,和以后的所有层
然后就好办了,代码如图:
代码
其中convertAB,convertBC就是AB交换,BC交换的函数,这两个函数可以自己定义,用中间变量即可
我爱编程网(https://www.52biancheng.com)小编还为大家带来Python汉诺塔递归问题的相关内容。
递归方法有些时候是不太好理解,不过递归的意义就是把解决问题n变成解决n-1的问题,最终变成解决1个问题。
假设有n个盘子,从上到下依次编号,最下面的盘子编号是大写的N。托盘分别是x,y,z。要把所有盘子从x移动到z。
前面几行代码就不解释了,很容易理解。
第五行,如果只有一个盘子,就直接从x移动到z。我爱编程网
第七行,如果不只一个盘子,先把上面n-1个盘子从x移动到y。
第八行,再把N号盘子从x移动到z。
第九行,再把刚才那n-1个盘子从y移动到z。
至于那n-1个盘子是怎么移动的,再次调用这个函数,把问题变成n-2个盘子加1个盘子的问题。
2025-02-01 20:24:39
2025-02-12 03:21:37
2025-02-10 15:19:48
2025-01-28 17:58:32
2024-11-22 05:08:01
2024-09-10 08:50:00