python - 递归算法 - 使用 '+' 扩展与创建新列表

标签 python algorithm recursion combinations

所以我在下面有一个递归函数,它不断用字母表中的每个小写字母替换 '_' 字符,直到这些可能的小写字母的所有组合都被替换为 '_' 个字符。

简单示例:

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/

相关文章:

iphone - 二维线段变形算法

c - 递归调用的总线 10 错误

python - 为什么我的代码不迭代每一行?尽管剥离了(使用 .read() 传入的 .txt 输入),但仍存在关键错误 "\n"

python utf-8编码抛出UnicodeDecodeError尽管 "errors = '替换'“

php - 在 Python 中存储唯一字符

java - 两种打印所有排列的方法-返回与通过“结果”列表

javascript - CoffeeScript:使用 yield 和递归

Python Plotly - 向箱线图添加水平线

algorithm - 在半径增加的二维网格中查找相邻单元格

c++ - 如何将 for_each 与作为重载 operator() 的函数一起使用