0

これはおそらくPython用のIDLEエディターの問題です。(OSXでPython 3.3.0を実行していますが、2.7.3でも同じ問題が発生します)

私はIDLEを使用してPythonプログラムを作成しています。私の問題は次のとおりです。再帰関数を呼び出すと、それ自体が何度も(1000回)呼び出されても、実行時エラーは1つも発生しませんが、プログラムを閉じるまでエラーメッセージが送信され続けます。

送信する必要のあるエラーは、「RuntimeError:最大再帰深度を超えました」です。それが1000回送信するエラーは、スクリプトのどこに問題があるかを単に指摘するだけです。

Traceback (most recent call last):
  File "<pyshell#112>", line 1, in <module>
    factorial(1.5)
  File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial
    recurse = factorial(n-1)
  File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial
    recurse = factorial(n-1)

これは、それ自体を何度も呼び出すすべての再帰関数に当てはまりますが、ここで使用される特定の関数は次のとおりです。

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result
4

2 に答える 2

1

Pythonがこれらの数百のエラーを表示しないようにするには、次のtry-exceptブロックを使用できます。

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result
try:
    print (factorial(6000))
except RuntimeError as e:
    print (e)

出力:

#print factorial(1000)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

#print factorial(6000)
maximum recursion depth exceeded in comparison

あなたの場合、Pythonには最大再帰深度に制限があるため、このエラーが発生します。これは、Cスタックがオーバーフローするのを防ぐためのものです。ただし、次を使用して変更できますsys.setrecursionlimit

In [4]: import sys

In [5]: sys.getrecursionlimit()
Out[5]: 1000
于 2013-03-15T18:16:26.740 に答える
0

問題は、floatを使用しようとしていて、コードがそれを処理しないことです。したがって、1.5 -1は0.5になり、最初の再帰呼び出しが発生します。次に、0.5 -1は-0.5になり、さらに再帰呼び出しが発生します。

それを処理するために、次を使用します:-

n <= 0の場合:1を返します

于 2013-03-15T18:13:06.973 に答える