Как создать рекурсивную функцию, которая генерирует несколько циклов for и подсчитывает общее время - PullRequest
3 голосов
/ 29 марта 2019

Я пытался подсчитать общее количество вызовов с помощью рекурсивной функции, которая генерирует n циклов for, но переменная, кажется, никогда не меняет своего значения.

a=0

def recursivelooping(times,volumes):
    if times==0:
        a+=1
    else:
        for i in range(volumes):
            return recursivelooping(times-1,i)

Результат должен выглядеть больше как переменная a ниже, но вместо этого я всегда получаю ноль.

def multiforloop(volumes):
    a=0
    for i in range(volumes):
        for j in range(i):
            for k in range(j):
                a+=1
    print(a)

1 Ответ

0 голосов
/ 29 марта 2019

Если я правильно понимаю, что замыкание может быть кратчайшим решением:

def recursivelooping():
    a = 0
    def f(times, volumes):
        nonlocal a
        if volumes == 0:
            return a

        # Inner loop
        for t in range(times):
            for j in range(volumes):
                a+=1

        # Outer loop
        return f(times, volumes-1)
    return f

def multiforloop(times, volumes):
    a=0
    for i in range(volumes+1):
        for t in range(times):
            for j in range(i):
                a+=1
    return a

print(recursivelooping()(1, 10))
print(multiforloop(1, 10))

Это выдает 55 для обоих (как в n * (n + 1) / 2).Закрытие - это просто функция (здесь f), сопровождаемая окружением (некоторый контекст, который отображает имена в переменные, здесь a один).Это означает, что a доступен из f, как если бы это была локальная переменная, но это не совсем локальная переменная, это свободная переменная

Когда вы пишете a += 1, обычное поведение - искать локальную переменную с именем a, вместо этого здесь a является свободной переменной, поэтому нам нужно добавить ключевое слово nonlocal, чтобы указать это.

...