2017-08-03 10 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':あなたはたとえば、あなたのif-statement内の値を返すしている場合ときにもelif/elseを使用する必要はありませんか?各関数呼び出しは新しいスタックを割り当てなければならないので、おそらく各呼び出しで多くのリソースを使用しています。 – Zizouz212

答えて

1

それはクラッシュしませんが、再帰の数が大きくなると、それはあなたがすでに計算された値を格納するために辞書を渡すことで、再帰で物事をスピードアップするためにmemoizationを使用することができ、計算に時間がかかりすぎると、再度計算するのではなく、辞書から簡単に検索することができます。おそらく

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

関連する問題