2017-08-03 62 views
0

我需要一些帮助做些功课。我对python并不熟悉。不过,我在这个小型的python程序中遇到了一些问题。它使用递归来打印出一组基于给定函数的数字。它达到约num = 30,程序崩溃。不知道什么是错的或如何解决它。帮帮我?修复处理后崩溃的递归python程序

def func(num): 
    if num==0: 
    return 0 
elif num==1: 
    return 1 
else: 
    return func(num-1)+2*func(num-2) 
for num in range(2,101): 
print(num,func(num)) 
+0

可能是一个'StackOverflowError'?每个函数调用都必须分配一个新的堆栈,因此每次调用时可能会使用大量资源。 – Zizouz212

回答

1

它不会崩溃,但递归的数量变大,时间过长来计算,你可以使用memoization加快速度在递归通过传递一个字典存储已经计算出的值和那么你可以很容易地从字典中检索它,而不是再次计算。你也不需要使用elif/else时,如果您是if-statement内返回一个值,例如:

def func(num, m): 
    if num == 0: 
     return 0 
    if num == 1: 
     return 1 
    if num not in m: 
     m[num] = func(num-1, m)+2*func(num-2, m) 
    return m[num] 

m = {} 
for num in range(2,101):  
    print(num,func(num, m)) 
+1

你不能只用'functools.lru_cache'吗? – Zizouz212

+0

@ Zizouz212 OP没有提到python版本,'functools.lru_cache'在Python 2中不可用afaik –

+0

我刚刚通过'print'函数计算出来。但是你是对的,它只是在Python 3中。 – Zizouz212