首页 > 解决方案 > 更有效的递归方法

问题描述

在我的代码中,我有这个:

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.”

标签: pythonrecursion

解决方案


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)))

推荐阅读