首页 > 解决方案 > 在 Python 中返回格式正确的递归列表

问题描述

这是让我头疼的家庭作业,我想知道是否有人可以帮助我了解我哪里出错了。本质上,我有两个字符串,“a”和“b”。如果“a”或“b”为空,我返回另一个字符串,否则,我返回每个字符串中的第一个字符加上每个字符串其余部分的递归调用的并集。因此,这对我来说是递归的尖叫,所以我构建了以下函数。

def myFunction(s, t):
    if len(s) == 0:
        return([t])
    if len(t) == 0:
        return([s])
    else:
        to_add = [[s[0]] + (myFunction(s[1:], t)), ([t[0]] + myFunction(s, t[1:]))]
        return(to_add)

当使用输入 s = "ab" 和 t= "cd" 调用函数时打印:

[['a', ['b', 'cd'], ['c', ['b', 'd'], ['d', 'b']]], ['c', ['a', ['b', 'd'], ['d', 'b']], ['d', 'ab']]]

所以据我所知,这不是一个真正的逻辑问题,更多的是我对如何返回我的代码有点傻,因为我期待的答案就在那里,就在一堆列表中的列表。我期待的答案是:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']

如果有人能指出我在哪里真的很傻/建议更好的方法来做这件事,我会非常感激,因为我开始对此感到非常难过哈哈。

标签: pythonrecursion

解决方案


您作为预期答案给出的答案看起来更像是字符串的每个可能组合,s并且按照它们在和中的顺序t保持字符从st在结果中的顺序。st

要在一个简单的生成器函数中实现这一点:

def combine(s, t):
    if not s:
        yield t
    elif not t:
        yield s
    else:
        for tail in combine(s[1:], t):
            yield s[0] + tail
        for tail in combine(s, t[1:]):
            yield t[0] + tail


print(list(combine('ab', 'cd')))

结果:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']

推荐阅读