数一数河内的动向

2024-09-24 19:53:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在数河内塔的移动

In [4]: %paste      
count = 0
def hanoi(n, a, b, c):
    global count 
    if n == 1:
        count += 1
    else:
        hanoi(n - 1, a, c, b)
        hanoi(1, a, b, c)
        hanoi(n - 1, b, a, c)


hanoi(10, "A", "B", "C")
## -- End pasted text --

In [5]: print(count)
1023

上述解决方案使用了global关键字
如果不引入全球化,怎么能做到呢?你知道吗


Tags: textinifdefcount关键字解决方案global
3条回答

没有必要为此使用复杂的代码。毕竟,这是基于数学的,所以只要使用这个简单的一行解决方案,在每一个代码中每次都有效。 把它放在河内代码的末尾使用标签ofc。。。但之前 河内(10,“A”、“B”、“C”) 把那些根本用不着的“清点”人员都撤掉。你知道吗

print(2**n-1)

比方说,你的河内代码是这样结束的,用这个数学代码:

def hanoi(n,f,h,t,):
    if n==0:
        pass
    else:
        hanoi(n-1,f,t,h)
        move(f,t)
        hanoi(n-1,h,f,t)
    print(2**n-1)

河内(4,“A”、“B”、“C”)

你不必再编写其他代码来计算。只需在代码的和处输入数字。越少越好,越快。。。 如果你让所有的代码都变长并扩散,结果会变慢。电脑:学生是用来做数学的,那我们为什么不使用它呢!?你知道吗

另一件事是,河内代码本身比这些计数代码更容易制作。让我们比较一下这个randint代码。。。 河内代码只需要一个打印/格式,如下所示:

print("Move object from {} to {}!" .format(f,t))

您还可以在代码中去掉int和str。任何选择,你都可以省去代码,让它更快更干净。当有数以百万计的代码时,这样做是合理的。除非你想在主代码中隐藏一些东西。你知道吗

原因是,只有一个起点/终点。空点(当它们是空的时候)只是“帮助”点。我不想谈得太深。 但最后。。。你知道吗

数学中的组合数学,甚至是Python中的组合数学,给出了事件的开始/结束点和数量,包括事件的多少(n),位置(A,B,C…),一些时间,甚至计时器/触发器(有很多选项)

学习河内大厦是有用的和强大的,理解,所以当你做你的代码,你可以使用这些给定的选项和打印它们,用简单的数学代码,而不是做复杂的代码错误。如果您愿意,您可以广告有许多微小的河内代码,因为您喜欢和仍然,您可以得到正确的答案(只是分开他们与r或n选项行或新行)。你知道吗

我希望这是更好的答案,在解释了组合数学之后。你知道吗

或者即使没有任何count变量:

def hanoi(n, a, b, c):
    if n != 1:
        return hanoi(n - 1, a, c, b) + hanoi(1, a, b, c) + hanoi(n - 1, b, a, c)
    return 1

print (hanoi(10, "A", "B", "C"))

输出

1023

通过一点重构使函数递归到一个公共的count变量:

def hanoi(n, a, b, c):
    count = 0
    if n == 1:
        count += 1
    else:
        count += hanoi(n - 1, a, c, b)
        count += hanoi(1, a, b, c)
        count += hanoi(n - 1, b, a, c)
    return count

输出

>>> hanoi(10, "A", "B", "C")
1023

相关问题 更多 >