我理解了阶乘和其他数学案例的递归,但这个是我的想法。
所以,我们必须将它分解为n-1直到基本情况,但我不知道代码如何分解以输出所有步骤?!
1 def printMove(fr, to):
2 print('move from ' + str(fr) + ' to ' + str(to))
3
4 def Towers(n, fr, to, spare):
5 if n == 1:
6 printMove(fr, to)
7 else:
8 Towers(n-1, fr, spare, to)
9 Towers(1, fr, to, spare)
10 Towers(n-1, spare, to, fr)
11 Towers(3,'t1','t3','t2')
move from t1 to t3
move from t1 to t2
move from t3 to t2
move from t1 to t3
move from t2 to t1
move from t2 to t3
move from t1 to t3
这是如何工作的?我是否需要能够理解这一点,或者通过编写一般的想法来编写高级代码,知道详细信息是否足够?
答案 0 :(得分:2)
减少样板文件可能有助于掌握递归:
def hanoi(n, src, hlp, dst):
if n > 0:
hanoi(n-1, src, dst, hlp)
print("moving disc " + str(n) + " from " + src + " to " + dst)
hanoi(n-1, hlp, src, dst)
# call with:
hanoi(3, 'src', 'hlp', 'dst')
<强>解释强>
递归是基于将第一个n-1光盘从“源”移动到“辅助”(中间塔) - 这是通过使用“目的地”塔作为“帮助者”来完成的。这是在以下行中完成的:
hanoi(n-1, src, dst, hlp)
然后将最大的环(n)从“源”移动到“目的地”(在“打印”中完成)。
然后再次递归地将n-1环从“助手”移动到“目的地”,同时使用“源”极作为“助手”:hanoi(n-1, hlp, src, dst)
答案 1 :(得分:0)
了解代码如何工作的详细信息对于在代码发生时修复代码问题是必要的。如果您编写一个您给定或找到的通用算法并且它碰巧工作没有太多麻烦,那就太好了。在自己的设计和开发中苦苦挣扎要困难得多。不知道你的代码如何工作将阻止你修复它。
答案 2 :(得分:0)
有时递归涉及我所谓的“信仰的飞跃”。移动一个没有任何东西的单个磁盘从一个塔到目的地很容易,你只需移动它。所以让我们假设递归函数hanoi
可以将一堆n
磁盘从当前位置src
移动到指定目标dst
根据需要备用塔hlp
。一旦我们假设它可以完成,我们很容易看到我们需要做的是将大小为n-1
的堆从底部磁盘移到备用塔上,将底部磁盘移动到目的地,然后将一堆n-1
磁盘从备用塔移回目的地的底部磁盘。任务完成!一旦你意识到用0个磁盘调用hanoi
函数实际上是无操作,Alfasin的代码重写就会清楚地表明这一点,所以当有一个磁盘时它会被移动,但两个递归调用包围那个移动的操作什么都不做。