在递归调用之间保留原始参数值(Python 2.7)

时间:2018-02-08 06:04:52

标签: python string python-2.7 function recursion

观察以下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”的副本,但在函数调用之间保持不变。但是,这会强制该函数具有另一个参数,这是不理想的。 所以这里的目标是找到一种优雅的方法来保持递归函数调用之间参数的初始值,特别是在每次调用后该参数发生变化时。你会怎么做?

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案,如果c总是一个字符,只需替换这一行:

c += c

用这个:

c += c[0]

答案 1 :(得分:0)

您需要做的就是将c+=c替换为c += c[0],因为您只想将c的出现次数增加1。