我是递归的新手,我正在尝试将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(数字是产品的除数)。
任何帮助都会非常有用。
答案 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循环。
有时需要引入额外的参数。在此示例中,已经设置的变量a
,b
等需要传入。自然的方法是使用列表。
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()