【发布时间】:2020-01-04 23:07:07
【问题描述】:
我理解只有一个嵌套函数的递归函数,比如这个:
def recurseInfinitely( n ):
try:
recurseInfinitely(n+1)
except RuntimeError:
print("We got to level %s before hitting the recursion limit." % n)
这个函数调用自己直到遇到障碍,也就是 998 次。
但是当一个函数调用自己两次时,我真的很困惑。
这个问题的灵感来自 youtube 上的一个视频,该视频解释了递归并通过使用 Python 解决了一个名为河内之塔的问题。
Recursion 'Super Power' (in Python) - Computerphile
我把函数改成了这些:
def move(x, y, name):
print(" {} Move from {} to {}".format(name, x,y))
def hanoi(n_of_disks,from_position,helper_position,target_position, name):
if n_of_disks==0:
print("#name: %s do nothing if there's no disk: %d" % (name, n_of_disks))
pass
else:
# --> A
print("Before A, name: %s disk: %d" % (name, n_of_disks))
hanoi(n_of_disks-1, # 3
from_position, # A
target_position, # C
helper_position, # B
name='FIRST RECURSOR')
move(from_position, # A
target_position, # C
name)
# --> B
print("Before B, name: %s disk: %d" % (name, n_of_disks))
hanoi(n_of_disks-1, # 3
helper_position, # B
from_position, # A
target_position, # C
name='SECOND RECURSOR')
然后运行它...
hanoi(n_of_disks=4,
from_position='A',
helper_position='B',
target_position='C',
name="START THE SHOW")
结果是:
Before A, name: START THE SHOW disk left: 4
Before A, name: FIRST RECURSOR disk left: 3
Before A, name: FIRST RECURSOR disk left: 2
Before A, name: FIRST RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from A to B
Before B, name: FIRST RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from A to C
Before B, name: FIRST RECURSOR disk left: 2
Before A, name: SECOND RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from B to C
Before B, name: SECOND RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from A to B
Before B, name: FIRST RECURSOR disk left: 3
Before A, name: SECOND RECURSOR disk left: 2
Before A, name: FIRST RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from C to A
Before B, name: FIRST RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from C to B
Before B, name: SECOND RECURSOR disk left: 2
Before A, name: SECOND RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from A to B
Before B, name: SECOND RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
START THE SHOW Move from A to C
Before B, name: START THE SHOW disk left: 4
Before A, name: SECOND RECURSOR disk left: 3
Before A, name: FIRST RECURSOR disk left: 2
Before A, name: FIRST RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from B to C
Before B, name: FIRST RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from B to A
Before B, name: FIRST RECURSOR disk left: 2
Before A, name: SECOND RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from C to A
Before B, name: SECOND RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from B to C
Before B, name: SECOND RECURSOR disk left: 3
Before A, name: SECOND RECURSOR disk left: 2
Before A, name: FIRST RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
FIRST RECURSOR Move from A to B
Before B, name: FIRST RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from A to C
Before B, name: SECOND RECURSOR disk left: 2
Before A, name: SECOND RECURSOR disk left: 1
#name: FIRST RECURSOR do nothing if there's no disk: 0
SECOND RECURSOR Move from B to C
Before B, name: SECOND RECURSOR disk left: 1
#name: SECOND RECURSOR do nothing if there's no disk: 0
一些问题:
- 为什么它的行为就像它的线程?
- 为什么一开始会从 4 倒数到 1,后来又这样?
- 为什么第一步不是从A到C,而是从A到B?
-
递归在现实生活中真的有用吗? 根据我的阅读,它是:
- (-)资源昂贵
- (-)慢
- (+)更易于实施
【问题讨论】:
标签: python recursion towers-of-hanoi