再帰関数
- 理解:関数は自分自身自分自身を呼び出すには、この関数は、内部で再帰関数です。
- 長所:単純な再帰関数の利点が定義され、明確なロジック。理論的には、すべての再帰関数は、循環方式で書かれていますが、再帰的なループロジックが明確であるほど良好ではないことができます。
- 再帰関数の例:
- 階乗:
コード:
`` `
`` ` #
の階乗-再帰関数実装::. 1. 1 * 2 * 3 *実施例3階乗
:DEF階乗(X)
でない場合でisinstance(X、(INT))またはX <0:パリティパラメータ型#正の整数または0でなければなりません
昇給の例外TypeError( "パラメータxタイプは正の整数でなければなりません")
のelifのx == 0:
。リターン1つの#0の階乗は1である。
他:
(X-1)のx *階乗リターン
位(X *階乗を返す爆発しました1-X)
#3 = Xを、結果は3 *階乗(3-1)である(すなわち、X = 2)
、結果は2 *階乗(2-1)(すなわち、1 = X)2#第X =である場合
#Xは= 1、結果は1つの*階乗(1-1)(すなわち、3 = X)であり、
#X = 0、結果は1つのである
#2 *最終結果1 *。* 3 1枚の
プリント(階乗(3))- 結果:
- スタックオーバーフロー:コンピュータに、関数呼び出しがこのデータ構造スタック(スタック)を介して達成されるたびにスタックへの関数呼び出しスタックフレームがそれぞれ時間関数が戻ると、1だけ増加され、スタックは、層スタックを減少させますフレーム。スタックサイズは無制限ではないので、あまりにも再帰呼び出しの数は、スタックオーバーフローを引き起こす可能性がありますよう
- オーバーフロー例をスタック:
- 解決策:
尾递归优化
末尾再帰関数が戻ると、それ自体が自分自身を呼び出し、そして時に、return文が式を含むことができない、ということを意味します。このように、コンパイラやインタプリタはあなたが関係なく、唯一のスタックフレームを占有回数、末尾再帰、自身への再帰呼び出しを最適化しないように行うことができ、スタックオーバーフローの状況が発生しません。 - 例最適化された末尾再帰:https://www.liaoxuefeng.com/wiki/1016959663602400/1017268131039072
- オーバーフロー例をスタック:
- 階乗: