2017-09-19 6 views
1
import sys 

num = long(raw_input("Enter the number for the factorial -> ")) 
sys.setrecursionlimit(num + 1) 


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


print fact(long(num)) 

にエラーを与え、私は階乗見つけるために使用され、最大の再帰限界深さが「997」であるので、私が使用することを変更しようとしたコードである: -再帰制限は、上記の階乗関数で

インポートsysを
sys.setrecursionlimit()

ただし、それでもエラーが発生します。他に何ができますか?

+1

上限を増やすことができます。実行されているPython関数だけでなくスタックに多くのものがあります。オーバーヘッドを追加する必要があります。 –

+1

代わりに[反復解法](https://stackoverflow.com/questions/5136447/function-for-factorial-in-python)を使用してください。 – CoryKramer

答えて

0
import sys 

num = long(raw_input("Enter the number for the factorial -> ")) 
sys.setrecursionlimit(num + 1) 


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


print 
print "Factorial is -> ", fact(int(num)) 

これは完璧に動作し、我々は再帰の制限は、正確な科学ではありません> 997

+0

申し訳ありませんが、回答のうち* 1つだけを受け入れたものとしてマークすることができます。自分の投稿が承認マークを持つべきものであると感じるなら、それはいいです。あなたとあなただけが選択肢です。 –

3

呼び出しフレームもカウントされます。 fact(10)については、フレームが必要です。 longの整数を渡すと、ラインをさらに下回る追加作業が発生し、別のフレームが必要になります。数に2を追加します:あなたはfact()関数を呼び出すコードを呼び出す他のフレームを持っている場合

sys.setrecursionlimit(num + 2) 

は、より多くのを追加します。最初に入力にlong()を呼び出すことには意味がないことに注意してください。 Pythonは必要に応じて自動的にlongオブジェクトを生成します。

つまり、私は再帰制限に悩まされませんでした。おそらくの値をに設定しますが、調整しないでください。

def fact(n): 
    num = 1 
    while n > 1: 
     num *= n 
     n -= 1 
    return num 

またはより良いまだ、ホイールを再発明していないし、代わりにmath.factorial()を使用します。

良いアイデアは、再帰を使用しないにあります。 Python 3.2以降では、Pythonの実装ではbinary split factorial algorithm(最初の21ほどの結果の表)が使用されています。

+0

この例でコードを実行するには、もう1つのフレームが 'long'それは謎のフレームがどこから来たのか)。 –

+0

@JaredGoguen:いいえ、 'fact()'が呼び出される前に 'long()'がすでに返されています。 –

+0

@JaredGoguen:ああ、値が変換されると、他の場所でスタックと混乱します。 'long100 = 100L'と' sys.setrecursionlimit(101) 'と' fact(long100) 'で再現できます。 –

関連する問題