在 Python 中将嵌套循环转换为递归函数
Covert Nested Loop to Recursive Function in Python
你好,我会用上下模式一一写出文本的所有状态,我可以通过 nested for 但是它仅对具有 6 个字符的文本有用,我会将其转换为 Recursive 谁能帮忙?
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
请问有人能帮忙吗?
我不会使用递归本身,而是使用 while 循环:
text=['a','b','c','d','e','f']
remaining_text = text[:] #copy the array
options = [''] # we start with an empty string so we can easily append to it
while remaining_text:
# get the first letter and removes it from the list in one go
next_letter = remaining_text.pop(0)
# and add one option with lowercase and one with uppercase
# for every existing option
options = (
[option + next_letter.lower() for option in options]
+ [option + next_letter.upper() for option in options]
)
print(options)
你可以为此使用递归,见下文。
以这种方式使用递归生成器的主要好处是您不会在内存中建立中间结果或计算您最终不会使用的值。如果您需要计算很多排列,这可能是个好主意。
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']
您也可以使用 itertools.product。
一种方法是生成 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())
:
from itertools import product
text = 'abcdef'
out = []
for chars in product(*((c, c.upper()) for c in text)):
out.append(''.join(chars))
print(out)
由于您专门要求递归,这是一种方法:
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 upper_lower(chars):
if len(chars) > 0:
first, *rest = chars
for combo in upper_lower(rest):
yield first.lower() + combo
yield first.upper() + combo
else:
yield ''
在没有中间分配的情况下处理一般可迭代输入的优雅工作也很好,但我还没有找到一个简短的、可读的。
你好,我会用上下模式一一写出文本的所有状态,我可以通过 nested for 但是它仅对具有 6 个字符的文本有用,我会将其转换为 Recursive 谁能帮忙?
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
请问有人能帮忙吗?
我不会使用递归本身,而是使用 while 循环:
text=['a','b','c','d','e','f']
remaining_text = text[:] #copy the array
options = [''] # we start with an empty string so we can easily append to it
while remaining_text:
# get the first letter and removes it from the list in one go
next_letter = remaining_text.pop(0)
# and add one option with lowercase and one with uppercase
# for every existing option
options = (
[option + next_letter.lower() for option in options]
+ [option + next_letter.upper() for option in options]
)
print(options)
你可以为此使用递归,见下文。 以这种方式使用递归生成器的主要好处是您不会在内存中建立中间结果或计算您最终不会使用的值。如果您需要计算很多排列,这可能是个好主意。
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']
您也可以使用 itertools.product。
一种方法是生成 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())
:
from itertools import product
text = 'abcdef'
out = []
for chars in product(*((c, c.upper()) for c in text)):
out.append(''.join(chars))
print(out)
由于您专门要求递归,这是一种方法:
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 upper_lower(chars):
if len(chars) > 0:
first, *rest = chars
for combo in upper_lower(rest):
yield first.lower() + combo
yield first.upper() + combo
else:
yield ''
在没有中间分配的情况下处理一般可迭代输入的优雅工作也很好,但我还没有找到一个简短的、可读的。