Python中将嵌套循环转换为递归函数

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:

您好,我将使用上下模式逐个编写所有文本状态,我可以通过嵌套的方式为编写,但它只对带有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[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))