嵌套for循环以在Python中递归

时间:2018-03-04 20:43:06

标签: python loops recursion nested

我需要在Python中使用递归重写这段可怕的代码。嵌套的深度应该取决于函数rec的参数,但事实上我希望它是变量的长度" a",它是字符串。我很感激任何回应和线索如何处理这个问题。

def rec():
    count=0
    for i in range(len(letters)):
        for j in range(i+1, len(letters)):
            if letters[i]+letters[j] in a:
                for k in range(j+1, len(letters)):
                    if letters[i]+letters[j]+letters[k] in a:
                        if letters[i]+letters[j]+letters[k]==a:
                            count+=1
                        else:
                            for l in range(k+1, len(letters)):
                                if letters[i]+letters[j]+letters[k]+letters[l]==a:
                                    count+=1

    return count

3 个答案:

答案 0 :(得分:5)

FWIW,使用itertools比使用递归更容易表达某些类型的组合逻辑。例如,当出现此模式时:

letters = 'ABCDEF'
for i in range(len(letters)):
    a = letters[i]
    for j in range(i+1, len(letters)):
        b = letters[j]
        for k in range(j+1, len(letters)):
            c = letters[k]
            print(a, b, c)

可以替换为:

from itertools import combinations

letters = 'ABCDEF'
for a, b, c in combinations(letters, 3):
    print(a, b, c)

你的问题还有很多,但我想指出组合函数是这个问题中提出的那种逻辑的一个很好的起点。

答案 1 :(得分:0)

这个糟糕的代码可以在迭代中重写如下,但会降低效率。同样适用于递归函数。

def rec():
    count=0
    for i in range(len(letters)):
        for j in range(i+1, len(letters)):
            for k in range(j+1, len(letters)):
                if letters[i]+letters[j]+letters[k]==a:
                     count+=1
                     continue
                for l in range(k+1, len(letters)):
                    if letters[i]+letters[j]+letters[k]+letters[l]==a:
                         count+=1

    return count

答案 2 :(得分:0)

只是递归解决方案......

def rec(letters, a):
    return sum(rec(letters[i+1:], a[1:])
               for i, c in enumerate(letters)
               if c == a[0]) if a else 1

演示:

>>> rec('onerene', 'one')
4