繁体   English   中英

如何在包括列表的 python 中精确地进行递归?

[英]How to do recursion precisely in python including lists?

我是一名初学者,试图在 Python 中学习递归。 我想打印给定字符串的所有排列。 例如:

输入:AABC

Output : AABC,AACB,ABAC,ABCA,ACAB,BAAC,BACA,BCAA,CAAB,CABA,CBAA

我使用递归在 Python 中编写了以下代码。

def foo(str,count):
    result = ""
    while(any(count)):
        for i in range(len(count)):
            if count[i]>0:
                count[i] -= 1
                result = str[i] + foo(str,count)
                print(result)
    return result

s = "AABC"
n = 4

c = {}
for i in range(len(s)):
    if s[i] in c:
        c[s[i]] += 1
    else:
        c[s[i]] = 1

str = list(c.keys())
count = list(c.values())
print(str,count)
foo(str,count)
print(count)

我得到 output 如下:

['A', 'B', 'C'] [2, 1, 1]

C

BC

ABC

AABC

[0, 0, 0]

这意味着代码只处理每个级别的第一种情况。 如何更正此代码?
任何帮助都会很棒。
谢谢你的时间:)

我不确定您使用count做什么,但这是一种递归方式(虽然不是非常理想)。

def foo(s,result):
    if len(result) == 4:
        print(result)
    if len(s) == 0:
        return
    for i in range(len(s)):
        new_s = s.copy()
        del new_s[i]
        foo(new_s,result + s[i])
s = list('AABC')
foo(s,'')

Output:

AABC
AACB
ABAC
ABCA
ACAB
ACBA
AABC
AACB
ABAC
ABCA
ACAB
ACBA
BAAC
BACA
BAAC
BACA
BCAA
BCAA
CAAB
CABA
CAAB
CABA
CBAA
CBAA

如果您想要不同的字符串,可以将它们添加到set

你的代码看起来有点乱,我很难理解你是如何用它来解决你的问题的。 我试图创建尽可能简单的解决方案,以帮助您理解创建任何类型列表组合背后的逻辑。

def combinations(x):
    if len(x) == 1:
        yield x
    for idx, i in enumerate(x):
        for comb in combinations(x[:idx]+x[idx+1:]):
            yield i + comb

s = "AABC"
print(list(combinations(s))) # -> ['AABC', 'AACB', 'ABAC', 'ABCA', 'ACAB' ...

x[:idx]+x[idx+1:]这里只是在idx的 position 处摆脱x的元素。 如果您有任何问题,请添加评论,以便我可以帮助您更好地理解我的解决方案。

我想出了一些可行的方法,但由于多次出现字符“A”,它给出了重复的答案,因此我使用 set() 来获得所需的答案。


def foo(s,l,result):
    if len(result)==4:
        l.append(result)
    for i in range(len(s)):
        foo(s[0:i]+s[i+1:],l,result+s[i])

s = "AABC"
l = []
r = foo(s,l,"")
print(list(set(l)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM