[英]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.