【解決方法】Python での再帰についての疑問


Hello,

I have a doubt about how the following recursion works:

私が試したこと:

def fact(n):

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

print(fact(4))

出力は 24 で、これは 4 の階乗です。
Python には math.factorial() という組み込み関数があることを知っています。 しかし、この場合、「事実」は階乗計算機としてどのように解釈されるのでしょうか? 再帰自体がどのように機能するかを理解していないと思います。
誰かこの疑問をはっきりさせてくれませんか?

どうもありがとう。

解決策 1

コードにはいくつかのステップがあります。
1. print ステートメントは fact 値 4 を渡す関数。
2. ファクト関数は、渡されたパラメーターの値をチェックします。
2. パラメータが 1 の場合、その値を返します。
3. 値が 1 でない場合:
3a. パラメータ値から 1 を引いた値を渡して自分自身を呼び出します (つまり、最初に 3 を渡します)。
3b. 返されると、返された値に元の値が乗算されます。
4. 次に、その番号を発信者に返します。

したがって、渡された値が 1 に達すると、呼び出し元に戻り、それによって他の return ステートメントが呼び出されます。 したがって、返された値を乗算すると、4 * 3 * 2 * 1 = 24 になります。

デバッガーでコードをステップ実行すると、実際の動作を確認できます。

解決策 2

リチャードが言ったことに追加するには…
再帰を ロシア人形(またはマトリョーシカ人形)[^] 可能な限り最小になるまで、それぞれに別のマトリョーシカが含まれています。 それぞれにアクセスするには、人形を開いて次のサイズを抽出します。

階乗の文字列定義を実装するだけの関数:

5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1

つまり、N が 1 より大きい場合は、N * factorial(N – 1) を返します。 それ以外の場合は 1 を返す

だからあなたの fact 関数は、N が 1 かどうかをチェックし、そうであれば 1 を返します。それ以外の場合は、自身を呼び出して N に (N – 1) 階乗を掛けます。 (直接的または間接的な)「自分自身を呼び出す関数」ビットが呼び出されます recursion、これは強力な手法ですが、現実の世界ではいくつかの重大な問題があるため、実際にはあまり使用されません。
デバッガーで実行すると、私の言いたいことがわかります。

階乗を使用した再帰のデモンストレーションは機能しますが、実際には再帰の貧弱な例です。ループの方がはるかに効率的でした。

コメント

タイトルとURLをコピーしました