ここにはいくつかの異なるものがあります。まず、再帰呼び出しの結果を実際に乗算する必要があります。そうしないと、その再帰は何もしません。次に、再帰を終了するための基本ケースを指定する必要があります。つまり、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)
で呼び出すか、その部分を処理するヘルパー関数としてこれを記述することもできます。