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

标签 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(乘积除数的数字)。

任何帮助都会非常有帮助。

最佳答案

您可以使用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))

更改 myprodrepeat 参数将更改您正在计算的循环数和因子。

此外,由于乘法是可交换的(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))

如果使用 setmyprod 中删除重复的结果,您会发现两个结果是相等的:

print set(myprod_unique(10, 6)) == set(myprod(10, 6))

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

关于python - 在 Python 中将 for 循环转换为递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40319750/

相关文章:

python - 在 python 中使用 * 或 ** 有什么好处吗?

python - 如何查找所有现有 Facebook 广告事件的 ID

python - 在Python中将递归转换为迭代

java - 递归随机枢轴排序的问题

递归调用自身的mysql存储过程

Python 记录重复输出

python - Django:当本地 .py 文件更改并动态加载时,有没有办法防止开发服务器重新启动?

python - 如何在Python中访问类对象属性

algorithm - 递归调用对完美二叉树建模的含义是什么?

haskell - 为什么内衬会在此构造上窒息?