python - 更有效的递归方法
问题描述
在我的代码中,我有这个:
def ree(n,m,l):
for a in range (0,l+1):
for b in range (0,l+1):
for c in range (0,l+1):
for d in range (0,l+1):
for e in range (0,l+1):
for f in range (0,l+1):
for g in range (0,l+1):
for h in range (0,l+1):
n_hedge = 1+a-b+c-d+2*e-2*f+2*g-2*h
m_hedge = (1-(2*a+2*b-2*c-2*d+e+f-g-h))
lst2.append(str(n_hedge)+str(m_hedge))
if n_hedge == n and m_hedge == m:
lst1.append(str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g)+str(h))
如何解决这个问题以不拥有所有这些“for a in ... for b in ... etc.”
解决方案
itertools.product
迭代包含所有可能值的元组(a, b, ... g, h)
:
from itertools import product
def ree(n, m, l):
# use argument unpacking with the asterisk operator
for x in product(*[range(0,l+1) for _ in range(0, 8)]):
# fetch loop variables from the tuple x
n_hedge = 1+x[0]-x[1]+x[2]-x[3]+2*x[4]-2*x[5]+2*x[6]-2*x[7]
m_hedge = 1-(2*x[0]+2*x[1]-2*x[2]-2*x[3]+x[4]+x[5]-x[6]-x[7])
lst2.append(str(n_hedge)+str(m_hedge))
# easier than explicitly concatenating strings
# use map to convert each loop variable
if n_hedge == n and m_hedge == m:
lst1.append(''.join(map(str, x)))
推荐阅读
- dynamics-crm - 在 MS Dynamics 的单个阶段中添加/合并 2 个阶段(本地或在线)
- docker - 在环境变量中指定的端口而不是 9000 上启动 sonarqube
- macos - 可可应用程序进入全屏不显示键盘快捷键
- angular8 - 如何不引导 Angular Web 元素进行延迟加载
- ios - iOS Receipt Data 在其他设备中返回 nil
- sqlite - 是否可以从 VS Code 中的 Android 或 iOS 模拟器查看 SQLite 数据库?
- angular - 带有 lambda 函数的 AWS Cloudfront 错误
- r - 在一个对象中合并对象类日期
- json-rpc - 如何在 Substrate 的 pow 共识中包含一个 json-rpc?
- amazon-web-services - 使用 terraform 和 apex 将单个 IAM 策略附加到两个不同区域(同一帐户)中的两个单独角色