[ad_1]
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
、これは強力な手法ですが、現実の世界ではいくつかの重大な問題があるため、実際にはあまり使用されません。
デバッガーで実行すると、私の言いたいことがわかります。
階乗を使用した再帰のデモンストレーションは機能しますが、実際には再帰の貧弱な例です。ループの方がはるかに効率的でした。
[ad_2]
コメント