给定一个数字n和一个除数列表A,我如何有效地找到乘以该数字时产生的所有除数组合?
例如
n = 12
A = [2, 3, 4]
输出:
[[3, 2, 2],
[2, 3, 2],
[2, 2, 3],
[4, 3],
[3, 4]]
这是我到目前为止所做的(代码是我根据 stackoverflow 上的许多查找质因数分解问题之一重新改编的):
def products(n, A):
if n == 1:
yield []
for each_divisor in A:
if n % each_divisor == 0:
for new_product in products(n // each_divisor, A):
yield new_product + [each_divisor]
这段代码似乎工作正常,但速度非常慢,如果我尝试使用记忆化(A作为元组传递给函数以避免不可散列的类型错误),则代码不会提供正确的结果。
关于如何提高这段代码的效率有什么建议吗?
我尝试过的记忆代码如下:
class Memoize:
def __init__(self, fun):
self.fun = fun
self.memo = {}
def __call__(self, *args):
if args not in self.memo:
self.memo[args] = self.fun(*args)
return self.memo[args]
@Memoize
def products(n, A): [as above]
当使用上面定义的参数调用函数时n, A:
>>> list(products(12, (2, 3, 4)))
[[3, 2, 2]]
如果没有记忆,相同代码的输出是:
[[3, 2, 2], [2, 3, 2], [2, 2, 3], [4, 3], [3, 4]]
请注意,其他记忆功能(例如来自functools包@functools.lru_cache(maxsize=128))会导致相同的问题。
繁花如伊
相关分类