Python中将嵌套循环转换为递归函数
您好,我将使用上下模式逐个编写所有文本状态,我可以通过嵌套的方式为编写,但它只对带有6个字符的文本有用,我将它转换为递归的有人能帮我吗Python中将嵌套循环转换为递归函数,python,recursion,nested,nested-loops,Python,Recursion,Nested,Nested Loops,您好,我将使用上下模式逐个编写所有文本状态,我可以通过嵌套的方式为编写,但它只对带有6个字符的文本有用,我将它转换为递归的有人能帮我吗 text=['a','b','c','d','e','f'] for i in [0, 1]: if i == 1: text[0] = text[0].upper() else: text[0] = text[0].lower() for j in [0, 1]: if j == 1:
text=['a','b','c','d','e','f']
for i in [0, 1]:
if i == 1:
text[0] = text[0].upper()
else:
text[0] = text[0].lower()
for j in [0, 1]:
if j == 1:
text[1] = text[1].upper()
else:
text[1] = text[1].lower()
for w in [0, 1]:
if w == 1:
text[2] = text[2].upper()
else:
text[2] = text[2].lower()
for q in [0, 1]:
if q == 1:
text[3] = text[3].upper()
else:
text[3] = text[3].lower()
for z in [0, 1]:
if z == 1:
text[4] = text[4].upper()
else:
text[4] = text[4].lower()
for g in [0, 1]:
if g == 1:
text[5] = text[5].upper()
else:
text[5] = text[5].lower()
print(''.join(text))
输出在下面,其正确,但我将使用递归:
abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef
abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf abCdEf
aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef aBcDef
aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf aBCDEf
AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef AbCdef
ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf ABcdEf
ABCDef ABCDef ABCDef ABCDef ABCDef
有人能帮忙吗?我不会使用递归本身,而是使用while循环:
text=['a','b','c','d','e','f']
剩余文本=文本[:]#复制数组
options=['']#我们从一个空字符串开始,这样就可以很容易地附加到它
保留文本时:
#获取第一个字母并一次性将其从列表中删除
下一个字母=剩余的文本.pop(0)
#并添加一个小写和一个大写选项
#对于每个现有选项
选项=(
[option+next_letter.lower()表示选项中的选项]
+[option+next_letter.upper()表示选项中的选项]
)
打印(选项)
您可以使用递归进行此操作,请参见下文。
以这种方式使用递归生成器的主要好处是,不会在内存中生成中间结果,也不会计算最终不会使用的值。如果你需要计算大量的排列,这可能是个好主意
def caps_permutations(sequence):
if len(sequence) == 0:
raise ValueError()
elif len(sequence) == 1:
element = sequence[0]
yield [element.lower()]
yield [element.upper()]
else:
# Copy to avoid mutating input sequence
inner_sequence = copy.copy(sequence)
element = inner_sequence.pop(0)
for inner_permutation in caps_permutations(inner_sequence):
yield [element.lower()] + inner_permutation
yield [element.upper()] + inner_permutation
text=['a','b','c','d','e','f']
for permutation in caps_permutations(text):
print(permutation)
预期产出:
['a', 'b', 'c', 'd', 'e', 'f']
['A', 'b', 'c', 'd', 'e', 'f']
['a', 'B', 'c', 'd', 'e', 'f']
['A', 'B', 'c', 'd', 'e', 'f']
['a', 'b', 'C', 'd', 'e', 'f']
['A', 'b', 'C', 'd', 'e', 'f']
...
['A', 'B', 'C', 'D', 'E', 'F']
您也可以使用 一种方法是生成所有可能的
True
和False
乘积,对text
中的字符数进行重复,并使用该乘积将每个字符以小写或大写字母表示
from itertools import product
text = 'abcdef'
out = []
for capitalized in product([False, True], repeat=len(text)):
out.append(''.join([char.upper() if upper else char for char, upper in zip(text, capitalized)]))
print(out)
输出:
['abcdef', 'abcdeF', 'abcdEf', 'abcdEF', 'abcDef', 'abcDeF', 'abcDEf', 'abcDEF', 'abCdef', 'abCdeF', 'abCdEf', 'abCdEF', 'abCDef', 'abCDeF', 'abCDEf', 'abCDEF', 'aBcdef', 'aBcdeF', 'aBcdEf', 'aBcdEF', 'aBcDef', 'aBcDeF', 'aBcDEf', 'aBcDEF', 'aBCdef', 'aBCdeF', 'aBCdEf', 'aBCdEF', 'aBCDef', 'aBCDeF', 'aBCDEf', 'aBCDEF', 'Abcdef', 'AbcdeF', 'AbcdEf', 'AbcdEF', 'AbcDef', 'AbcDeF', 'AbcDEf', 'AbcDEF', 'AbCdef', 'AbCdeF', 'AbCdEf', 'AbCdEF', 'AbCDef', 'AbCDeF', 'AbCDEf', 'AbCDEF', 'ABcdef', 'ABcdeF', 'ABcdEf', 'ABcdEF', 'ABcDef', 'ABcDeF', 'ABcDEf', 'ABcDEF', 'ABCdef', 'ABCdeF', 'ABCdEf', 'ABCdEF', 'ABCDef', 'ABCDeF', 'ABCDEf', 'ABCDEF']
或者通过生成元组的乘积(char,char.upper())
:
因为您特别要求递归,所以这是一种实现方法:
def alloptions(textlist):
if len(textlist) == 0:
return ['']
return [y + x for y in [textlist[0].lower(), textlist[0].upper()] for x in alloptions(textlist[1:])]
text=['a','b','c','d','e','f']
print(alloptions(text))
在数据结构上设计递归函数时,基本上发明了归纳原理。因此,您需要两种成分:
def上下(字符):
如果len(chars)>0:
首先,*rest=chars
对于上下组合(其余):
首先屈服。降低()+组合
首先屈服。上()+组合
其他:
屈服“
不过,在不使用中间分配的情况下,对通用可写输入进行优雅的处理也不错,但我还没有找到一个简短易读的输入。哦,我的兄弟,这太棒了,谢谢你,我认为循环比递归TNX好。)谢谢你的创意。谢谢;)
def alloptions(textlist):
if len(textlist) == 0:
return ['']
return [y + x for y in [textlist[0].lower(), textlist[0].upper()] for x in alloptions(textlist[1:])]
text=['a','b','c','d','e','f']
print(alloptions(text))