2011-12-07 8 views
4

は例えば、これは私の階乗関数である:リストを使ってPythonで再帰のためのスタックを合成しますか?例?

def fact(n): 
    if n<=1: return 1 
    else: return n*fact(n-1) 

しかし、nが高すぎる場合、それがクラッシュ。私はスタックエミュレーションを使用してこの全く同じ機能をエミュレートしたいと思います。どうすればこのようなことができますか?テール再帰的でない場合はどうなりますか?説明が見つからない。

答えて

4

まず第一に、あなたはそれが末尾再帰にすることができます:

def tfact(n,acc=1): 
    if n<=1: return acc 
    else: return tfact(n-1,acc*n) 

しかし、もっと直接的な翻訳のために:

def ifact(n): 
    stack = [] 
    while True: 
     if n==1: 
      while stack: 
       n *= stack.pop() 
      break 
     else: 
      stack.append(n) 
      n -= 1 
    return n 
関連する問題