我有一系列数字我需要找到它的总和。第一次迭代操作的值是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)
我做错了什么?
答案 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)