【问题标题】:Preserve Original Parameter Value between Recursive Calls (Python 2.7)在递归调用之间保留原始参数值 (Python 2.7)
【发布时间】: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


    【解决方案1】:

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

    c += c
    

    用这个:

    c += c[0]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 2023-01-15
        • 2016-01-22
        • 1970-01-01
        相关资源
        最近更新 更多