python - 如何创建一个递归函数,生成多个 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)
解决方案
如果我理解正确,闭包可能是最短的解决方案:
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
关键字来指定它的原因。
推荐阅读
- batch-file - 通过网络驱动器循环 robocopy
- bash - 如何查找包含字符串“dark”的 xml 文件和注释行?
- git - 当分支。
.remote 和分支。 .merge 由 Git 添加的值? - html - 为什么我的浮动元素显示为“楼梯”?
- laravel - 变量为空时处理错误 - Laravel
- javascript - 在提交表单之前等待异步调用完成
- hibernate - JPA/Hibernate:逆 OneToOne 孤儿删除约束违反
- r - 如何在 R 中找到函数的极值并确定它们的类型?
- python-3.x - ValueError: 字符 U+590048 不在范围 [U+0000; U+10ffff] - MAC 操作系统
- vue.js - vuejs我如何将我的数据传回查看