所以我在下面有一个递归函数,它不断用字母表中的每个小写字母替换 '_'
字符,直到这些可能的小写字母的所有组合都被替换为 '_'
个字符。
简单示例:
repl_underscores('__A')
>>>[a_A,b_A,c_A......aaA,abA,acA....zzA]
我让这个函数与 extend 一起工作来构建列表,正如下面的评论所提到的,重复修改相同的现有列表并完成工作。
为了练习,我想重新编写以在每次调用时构建一个新列表并将该结果传递给连续的递归调用,目的是获得相同的结果。
它不起作用,我知道这与我在每次调用时都建立一个新列表这一事实有关,但我认为,因为我在每次递归调用时都传入了构建版本,所以我会没问题,因为这些电话随后会收到更改通知。
我找不到它坏在哪里。我知道我可以通过修改同一个列表(通过可变默认值、全局变量或扩展)来让它工作,但我想在每次递归时建立一个新的干净列表。
def repl_underscores(letters,res=None):
if res is None: res = list()
if '_' not in letters: return res
repl = [letters.replace('_',letter,1) for letter in string.ascii_lowercase]
res = res + repl #using += works, due to extending being a mutation (same list referenced at each call)
for each in repl:
repl_underscores(each,res) #trying to pass modified list to keep building up
return res
print(repl_underscores('__DER'))
最佳答案
最好不要修改函数参数,而是使用返回值构建(更函数式的风格)。对您的代码稍作修改,即可按预期工作。
导入字符串
def repl_underscores(letters):
res = list()
if '_' not in letters: return res
repl = [letters.replace('_',letter,1) for letter in string.ascii_lowercase]
res += repl
for each in repl:
res += repl_underscores(each)
return res
print(repl_underscores('__DER'))
关于python - 递归算法 - 使用 '+' 扩展与创建新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728182/