递归Python中的堆栈溢出

时间:2019-03-18 20:58:37

标签: python python-3.x recursion matrix stack-overflow

我正在做欧拉计划问题78

  

p(n)代表n硬币可以分成不同堆的不同方式的数量。例如,可以用完全不同的七种方式将五枚硬币分成几堆,因此p(5)=7

     

找到n可以被p(n)整除一百万的最小值。

我正在尝试使用递归解决此问题。我知道这既不是最佳解决方案,也不是最快的解决方案,但我想尽可能地使这项工作可行。在n = 6000附近,我得到了:

  

MemoryError:堆栈溢出

这不是唯一的问题。我在网上检查过,解决方案约为53,000。我的矩阵只有10,000x10,000。如果我转到60,000x60,000,则返回MemoryError。 这是我的代码:

import sys
from time import process_time as timeit

sys.setrecursionlimit(100000)

table = [10000 * [0] for i in range(10000)]

def partition(sum, largestNumber):
    if (largestNumber == 0):
        return 0

    if (sum == 0):
        return 1

    if (sum < 0):
        return 0

    if (table[sum][largestNumber] != 0):
        return table[sum][largestNumber]

    table[sum][largestNumber] = partition(sum,largestNumber-1) + partition(sum-largestNumber,largestNumber)
    return table[sum][largestNumber]



def main():
    result = 0
    sum = 0
    largestNumber = 0
    while (result == 0 or result%100000 != 0):
        sum += 1
        largestNumber += 1
        result = int(partition(sum,largestNumber))
        if sum%1000 == 0:
            print('{} {}'.format(sum,timeit()))

    print("n = {}, resultado = {}".format(sum,result))
    print('Tempo = {}'.format(timeit()))
if __name__ == '__main__':
    main()

0 个答案:

没有答案