破坏的记忆代码

时间:2013-02-20 19:58:48

标签: python memoization

我有一系列数字我需要找到它的总和。第一次迭代操作的值是1,第二次是20.然后每次迭代使用公式n *(n + 1)/ 2中的先前结果,所以第三次迭代,比如i03 = 20 *(20 + 1)/ 2,第四,i04 = i03 *(i03 + 1)/ 2.这一直持续到i20的第20次迭代= i19 *(i19 + 1)/ 2.我想用memoization做这个。这是我的代码:

def outFun():
    def sumFun(squares, total = 0, CONST = 20):
        if squares > 2:
            total = sumFun(squares - 1) * int((sumFun(squares - 1) + 1) / 2)
        elif not squares - 2:
            total = CONST
        return total

    return 1 + sumFun(20)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你正在打电话

sumFun(squares - 1)

两次!

为什么不引入变量来存储结果?类似的东西:

if squares > 2:
    nextResult = sumFun(squares - 1)
    total = nextResult * ((nextResult + 1) / 2)

答案 1 :(得分:1)

以下是我理解您的问题的方法:您有一个公式x_n = x_{n-1} * (x_{n-1} + 1)/2,其递归基础定义为x_1 = 20(或x_2 = 20?从您的描述中不清楚)。解决递归的最有效方法是自下而上的方法,当你从x_1开始,然后计算x_2等。替代方法是使用动态编程/记忆:

mem={}
def f(x):
    if x == 1:   # base case
        return 20
    if not x in mem:    # if we did not calculate it before - calculate
        mem[x] = f(x-1) * (f(x-1) +1) / 2
    return mem[x]   # otherwise return it

print f(1)    
print f(2)
print f(3)

打印

20
210
22155

f(20)打印有点大,所以我会打印其中的位数:

print "number of digits: %s" % len(str(f(20)))

number of digits: 530115

代码在我的桌面上运行大约需要9秒钟:

import timeit
mem={}
print "Execution time: %s" % timeit.Timer("len(str(f(20)))",
                            setup = "from __main__ import f").timeit(1)