首页 > 解决方案 > 如何创建一个递归函数,生成多个 for 循环并计算总次数

问题描述

我试图通过生成 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)

标签: pythonfor-looprecursioncounting

解决方案


如果我理解正确,闭包可能是最短的解决方案:

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关键字来指定它的原因。


推荐阅读