在Python中将for循环转换为递归

时间:2016-10-29 13:51:02

标签: python recursion

我是递归的新手,我正在尝试将for循环转换为递归。

allProducts = []

for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                if (a*b*c*d)%6==0:
                    allProducts.append(a*b*c*d)

我无法将其转换为递归程序,这意味着我无法扩展。这个想法是这样的 - 在Python中定义一个递归程序,它接受输入A(for循环次数)和B(数字是产品的除数)。

任何帮助都会非常有用。

3 个答案:

答案 0 :(得分:2)

您应该查看内置程序包itertools

for a,b,c,d in itertools.product(range(10),range(10),range(10),range(10)):
    if (a*b*c*d)%6==0:
        allProducts.append(a*b*c*d)

答案 1 :(得分:2)

您可以使用itertools.product及其repeat参数:

from operator import mul
import itertools


def myprod(n, div, repeat=4):
    # i is a list of factors
    for i in itertools.product(range(n), repeat=repeat):
        # calculate product of all elements of list            
        prod = reduce(mul, i, 1)
        if prod % div == 0:
            yield prod

print list(myprod(10, 6))

更改repeat的{​​{1}}参数会改变您正在计算的循环次数和因子。

此外,由于乘法是可交换的(myprod),您应该使用a * b == b * a来消除重复计算:

itertools.combinations_with_replacement

如果您使用from operator import mul import itertools def myprod_unique(n, div, repeat=4): for i in itertools.combinations_with_replacement(range(n), r=repeat): prod = reduce(mul, i, 1) if prod % div == 0: yield prod print list(myprod_unique(10, 6)) myprod删除重复结果,您会发现两个结果相同:

set

但您已将操作次数从print set(myprod_unique(10, 6)) == set(myprod(10, 6)) 大幅减少到n ** r。例如92,378而不是(n+r-1)! / r! / (n-1)!的10,000,000,000。

答案 2 :(得分:0)

其他答案不使用递归。为了完整起见,这里有一个。

递归函数通常有两个部分。

  • 基本情况:直接处理。对应于代码中最内层循环的主体。

  • 递归案例:涉及再次调用该函数,对应于代码中的一个for循环。

有时需要引入额外的参数。在此示例中,已经设置的变量ab等需要传入。自然的方法是使用列表。

allProducts = []

def product(vals):
    res = 1
    for val in vals:
        res *= val
    return res

# n is the number of for loops remaining
# mod is the divisor
# vals is a list where the values of a, b, c, etc. will be placed
# start this function off using run(4, 6, [])
def run(n, mod, vals):
    if n == 0:
        # base case
        if product(vals) % mod == 0:
            allProducts.append(product(vals))
    else:
        # recursive case
        for i in range(10):
            # i takes the role of a, b, c, etc.
            # add i to the vals
            vals.append(i)
            # recursively iterate over remaining n-1 variables
            run(n - 1, mod, vals)
            # remove i
            vals.pop()