Если я правильно понимаю, что замыкание может быть кратчайшим решением:
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
, чтобы указать это.