在python中优化递归

时间:2019-05-02 19:08:09

标签: python algorithm recursion methods

我在优化python上的递归时遇到了麻烦。所以我想在由10个元素组成的数组/列表中生成所有可能性,每个元素可以用0-9数字填充。 因此,我决定在这种情况下使用递归,这是:

routes = []
route = []

def generateRoutes(route, floor):
    if floor >= 10:
        routes.append(route)
    else:
        for channel in range(0, 10):
            new_route=route.copy()
            new_route.append(channel)
            generateRoutes(new_route, floor + 1)

generateRoutes(route, 0)

我的代码需要永恒才能完成任务(更不用说要占用大量内存)。我的问题是,有没有办法解决/优化我的代码? (除了递归以外,我还开放其他方法)

编辑: 添加了有关函数调用方式的详细信息

2 个答案:

答案 0 :(得分:5)

已经通过itertools模块提供了一种非递归的惰性解决方案:

>>> import itertools
>>> routes = itertools.product(range(10), repeat=10)

当您遍历routes时,每个值都是按需生成的,而不是一次将所有100亿个值存储在内存中。

>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 1), (0, 0, 0, 0, 0, 0, 0, 0, 0, 2), (0, 0, 0, 0, 0, 0, 0, 0, 0, 3), (0, 0, 0, 0, 0, 0, 0, 0, 0, 4), (0, 0, 0, 0, 0, 0, 0, 0, 0, 5), (0, 0, 0, 0, 0, 0, 0, 0, 0, 6), (0, 0, 0, 0, 0, 0, 0, 0, 0, 7), (0, 0, 0, 0, 0, 0, 0, 0, 0, 8), (0, 0, 0, 0, 0, 0, 0, 0, 0, 9), (0, 0, 0, 0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 0, 0, 0, 1, 1), (0, 0, 0, 0, 0, 0, 0, 0, 1, 2), (0, 0, 0, 0, 0, 0, 0, 0, 1, 3), (0, 0, 0, 0, 0, 0, 0, 0, 1, 4), (0, 0, 0, 0, 0, 0, 0, 0, 1, 5), (0, 0, 0, 0, 0, 0, 0, 0, 1, 6), (0, 0, 0, 0, 0, 0, 0, 0, 1, 7), (0, 0, 0, 0, 0, 0, 0, 0, 1, 8), (0, 0, 0, 0, 0, 0, 0, 0, 1, 9)]
>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 2, 0), (0, 0, 0, 0, 0, 0, 0, 0, 2, 1), (0, 0, 0, 0, 0, 0, 0, 0, 2, 2), (0, 0, 0, 0, 0, 0, 0, 0, 2, 3), (0, 0, 0, 0, 0, 0, 0, 0, 2, 4), (0, 0, 0, 0, 0, 0, 0, 0, 2, 5), (0, 0, 0, 0, 0, 0, 0, 0, 2, 6), (0, 0, 0, 0, 0, 0, 0, 0, 2, 7), (0, 0, 0, 0, 0, 0, 0, 0, 2, 8), (0, 0, 0, 0, 0, 0, 0, 0, 2, 9), (0, 0, 0, 0, 0, 0, 0, 0, 3, 0), (0, 0, 0, 0, 0, 0, 0, 0, 3, 1), (0, 0, 0, 0, 0, 0, 0, 0, 3, 2), (0, 0, 0, 0, 0, 0, 0, 0, 3, 3), (0, 0, 0, 0, 0, 0, 0, 0, 3, 4), (0, 0, 0, 0, 0, 0, 0, 0, 3, 5), (0, 0, 0, 0, 0, 0, 0, 0, 3, 6), (0, 0, 0, 0, 0, 0, 0, 0, 3, 7), (0, 0, 0, 0, 0, 0, 0, 0, 3, 8), (0, 0, 0, 0, 0, 0, 0, 0, 3, 9)]

答案 1 :(得分:1)

如果我正确理解了您的问题,那么itertools正是您想要的。 最可能是这样的:

import itertools
nums = list(range(0, 10))
routes = list(itertools.product(nums, LENGTH))

要解决内存问题,您应该考虑将其用作生成器:

import itertools
nums = list(range(0, 10))
for route in itertools.product(nums, LENGTH):
    # YOUR_STUFF

如果您真的只想遍历数字,为什么不这样做

for i in range(10**LENGTH):
    ...

好吧,要找到更好的解决方案,我想我们需要有关您要实现的目标的更多信息,因为我觉得这种方法并不是您想要实现的最佳方法。