【发布时间】:2018-07-18 14:52:28
【问题描述】:
观察以下 Python 2.7 函数:
def replace(c, st):
if st == "":
return []
else:
temp = [st + c]
c += c
return temp + replace(c, st[:-1])
print replace("z", "Howdy")
并观察输出:
['Howdyz', 'Howdzz', 'Howzzzz', 'Hozzzzzzzz', 'Hzzzzzzzzzzzzzzzz']
注意每次 z 的数量如何翻倍。考虑到在递归调用之间,修改后的版本会在每次调用后添加到自身,然后作为参数传递,这是有道理的。但假设所需的输出是这样的:
['Howdyz', 'Howdzz', 'Howzzz', 'Hozzzz', 'Hzzzzz']
请注意,这相当于:
def replace(c, st):
if st == "":
return []
else:
temp = [st + c]
c += INITIAL_VALUE_OF_C
return temp + replace(c, st[:-1])
print replace("z", "Howdy")
所以这里的目标是以某种方式存储 c 的初始值,而不会在递归调用之间改变它。我可以想到几个解决这个问题的方法,但没有一个看起来很优雅。例如,这个函数可以是一个将初始值存储为成员变量的类的方法,但是为了使用这个函数,这个类必须用构造函数进行实例化。我还可以向函数添加另一个参数,它是“c”的副本,但在函数调用之间保持不变。但是,这会强制函数具有另一个参数,这并不理想。 所以这里的目标是找到一种优雅的方法来在递归函数调用之间保留参数的初始值,特别是在每次调用后该参数发生变化时。你会怎么做?
【问题讨论】:
标签: python string python-2.7 function recursion