2016-12-04 15 views
1

この再帰ファクター計算ツールは、「RecursionError:最大再帰深度を比較して超えました」というエラーを受け取ったときに994の入力まで完全に実行されます。誰かがこれが意味することを説明してもらえますか?どのようにして再帰の最大量がありますか?前もって感謝します。再帰ファクター計算ツールRecursionError

def factorial(x): 
    if(x == 0): 
     return 1 
    else: 
     return x * factorial(x - 1) 
while True: 
    u_input = input("") 
    print(factorial(int(u_input))) 

def calc_factorial(num): 
    num-=1 
    fact_total = 1 
    while num > 0: 
     fact_total *= num 
     num-=1 
    return(fact_total) 

EDIT: 私は再帰がループとしてその関数の中から再利用機能ですが、私が何であるか、再帰の深さを理解していないと説明したいと考えていることを理解しています。私は他の質問に対する答えからは分かりませんでした。混乱の謝罪

+1

の可能性のある重複した[最大再帰の深?](http://stackoverflow.com/questions/3323001/maximum-recursion-depth) –

+0

私が何を再帰知っていただきたいと思いthat-私が見てきました深さは? – Matt

答えて

2

エラーとは、Pythonが再帰呼び出しの回数を制限していることを意味します。デフォルトは1000で、これはあなたがどこかで無限の再帰を持つ可能性が最も高い数値として選択されています。無限の再帰呼び出しをコンピュータが追跡することはできないため(このようなプログラムは決して終了しません)、このエラーメッセージで停止することは、コンピュータが処理できるほど深く繰り返されることが望ましいため、最終的にはスタックオーバーフローが発生します。

sys.setrecursionlimitを使用する場合はこの制限を変更できますが、この問題を回避する最良の方法は、再帰的ではなく反復的に動作するようにプログラムを変更することです。幸いなことに、これは階乗計算のために簡単です:

def factorial(x): 
    result = 1 
    for num in range(1, x+1): 
     result *= num 
    return result 
+0

なぜそれはそれを最大限にしますか? – Matt

+0

私は反復アルゴリズムも持っていますが、現在、反復メソッドにはしばらく時間がかかりますが、大きなメソッドほど高速なメソッドを見つけるために実験しています。 – Matt

+0

@Mattあなたが何か間違っていない限り、反復バージョンは速くなければなりません。関数呼び出しは、時間とメモリの両方で高価なので、制限があります。 –

3

再帰呼び出しは、他の関数呼び出しのようなものであり、関数呼び出しは、各関数の内部状態を追跡するためにメモリを使用しています。スタック上にあるすべてのネストされた関数呼び出しを示す非常に長いトレースバックが得られます。メモリは有限であるため、再帰深さ(ネストされた関数呼び出しの数)は、Pythonの強制制限なしでも本質的に制限されます。

0

数学ライブラリと機能にあります組み込まれている、すぐに階乗の値を取得するためのアルゴリズムを改善している、だから我々は階乗の値を取得するための再帰アルゴリズムを書いているとき、再帰的な限界があるでしょう。ですから、組み込みのライブラリを使用すれば、その問題から逃れることができます。

import math 
math.factorial(5) 

Answer : 120

関連する問題