-3

モジュールがあるだけでなく、整数の階乗を計算する方法が複数あることを知っていmathます。ただし、間違った結果を返す単純な関数をまとめようとしました。ここで何が悪かったのか知りたいです。たとえば、パラメーターとして 2 を渡すと 3 が返され、3 を渡すと 8 が返されます。

>>>def factorial(n):

        if n > 0:
            result = n * n-1
            factorial(n-1)
            return result 

>>>factorial (2)

   3

どうすればこれを修正できますか?

4

3 に答える 3

8

ここにはいくつかの異なるものがあります。まず、再帰呼び出しの結果を実際に乗算する必要があります。そうしないと、その再帰は何もしません。次に、再帰を終了するための基本ケースを指定する必要があります。つまり、n == 0 の場合に何をすべきかを関数に伝える必要があります。次のようなものを探しています。

if n == 0:
    return 1
elif n > 0:
    return n * factorial(n-1)

私のpythonはさびているので、構文がオフになる可能性がありますが、アイデアはわかります。

また、取得しているリターンの理由は、関数が本質的に を計算しているためであることに注意してくださいn*n-1。これは、操作の順序により、 の 2 乗よりも 1 少なくなりますn

もう一つ、ただの楽しみです。これまでに書いた関数は、大きな数に対して大きなスタックを作成しますが、これは良い考えかもしれませんし、そうでないかもしれません。したがって、代わりに末尾再帰にすることもできます。多くのコンパイラは末尾再帰関数を最適化しますが、コメントによると Python は最適化しません。これを行うには、次のようにアキュムレータを実装します。

def factorial(acc, n):
    if n == 0:
        return acc
    elif n > 0:
        return factorial(n*acc, n-1)

次に、関数をfactorial(1,n)で呼び出すか、その部分を処理するヘルパー関数としてこれを記述することもできます。

于 2013-04-06T17:50:32.363 に答える
4

関数にはいくつか問題があります。

  • n > 0条件が falseの場合、何も返されません。
  • n * n-1を計算(n * n) - 1します。おそらく意図したとおりですn * (n - 1)
  • 再帰的に呼び出しますfactorialが、結果に対して何もしません。現在、あなたのコードは if の中にだけ書いた場合と同じように動作しますreturn n * n - 1
于 2013-04-06T17:52:02.033 に答える
1

これが必要なだけです。最も単純な形式だと思います:

 def factorial(n):
     if n == 0: return 1
     return n * factorial(n-1)

いくつかの実行:

>>> factorial(1)
1
>>> factorial(13)
6227020800

次のフォームも使用できます。

def factorial(n): 
    if(n): return n*factorial(n-1)
    return 1

@ sepp2k の回答によるその種の追加

于 2013-04-06T17:54:02.667 に答える