Pythonの再帰
1.1再帰を説明します
1.定義
1.関数内、あなたは他の関数を呼び出すことができます。関数が自分自身の中に自分自身を呼び出す場合は、この関数は再帰関数です。
2、再帰的な性質
1.明確な終了条件が存在する必要があります
2.各エントリの再帰深く、問題の規模が前再帰と比較して低減されるべきです
3.再帰効率は高くはないが、再帰のあまりにも多くのレベルは、関数呼び出しを入力するたびに(コンピュータに、関数呼び出しが、このデータ構造のスタック(スタック)を介して達成され、スタックオーバーフローを引き起こすことができます
スタックは、関数戻り、毎回層スタックフレームを追加し、スタックは、一つのスタックフレームを減少します。スタックの大きさのためには無限ではないので、再帰呼び出しの数があまりにも多くのスタックオーバーフローが発生します)
1.2簡単な例は、再帰の原理を理解します
参考ブログます。https://www.cnblogs.com/Fantinai/p/7806356.html
1、再帰的なインスタンス
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - DEF digui(NUM): NUM印刷 :IF NUM> 0 digui(NUM - 1。) それ以外: 印刷「を------ ------ ' NUMプリント diguiを(3) ' ''の実行結果 。3 2 1 0 ------------ 0 1 2 3 '' '
1.たびに関数呼び出しの戻りがあり、一つは、代わりに(関数呼び出しの最初の部分で)メインに直接返すの1つ、再帰的に呼び出すことへの復帰です。
前記第1の再帰:N = 3 3 [3]の描画
前記第2の再帰:N = 2 2描画[3,2]
4。第3再帰:N = 1描画[3,2,1]
5. n = 0の場合、> 0がFalseではなく、再帰、印刷NUM = 0、機能彼のレベルで呼び出し元に戻る、すなわち、n = 1つのスタック
6.次に、位置digui(NUM - 1)下方を行う:印刷印刷NUM = 1、1スタック、スタック要素:[3,2]
7. 2、3、およびので、右の最終的な印刷を印刷します
2、解析結果
1.なぜそれ以上の成果でしょうか?忘れるために関数自体の後にコードを呼び出す考えているので、他の後にPythonコードです。
2.関数自体を呼び出すとき、コードが後に終了しますが、待っている状態ではありませんが、コードの実行後に、再度、対応する色で同じカラープリント()関数の文が待機Falseです。
あなたは再帰関数のdigui(3)を呼び出したときに、次のように3再帰関数を詳細、私は再帰関数分解を行うためにこれを入れてみましょう、実装プロセスは以下のとおりです。
1.2再帰的な階乗決意再帰的原則
1、コード階乗
#!/ usr / binに/ ENVのpython # - * -コーディング:UTF-8 - * - DEF試験(N): 1 == N場合: リターン1 他: RES = N *試験(N-1) の印刷「N:% S ----- RET:%S」%(N、RES) 戻りRESが 試験(4)#24印刷 ''」 2 ----- RET:N 2 、N:3 ----- RET: 6 N:4 ----- RET:24 24 ''」
#1、再帰的ステップ '' ' 1、第一の層(4)試験= *試験4(4-1)。 2、第二の層(3)試験*試験3 =(3-1) 。3、第層:試験(2)試験= 2 *(2-1) 。4、第四層:試験= 1(1)。 '' ' #2、ステップに戻る ' '' 注意:ユーバー位置である:RES = N *試験(N-1)、それは次に下方本明細書で知られている上部後方に戻りますが、リターンを実行する 5、N- =この時間の終わり第4層機能場合1は、コード・ブロック・リターン1のコードを実行する:RET = 1。 6、。第三の機能の第四の層位置の完了は、次に層まで行われた後のリターンを呼び出します。RET = * 2 1 。7、第3の層が第二層の折り返し位置の後にコールバック関数に戻ります:RET = 1 * 2 * 3 図8に示すように、第二層は、コールバック関数への最初の層のリターンの位置を戻します:RET = 1 * 2 * 3 * 4 コールは第一層の位置に達した後、上方位置は、再帰的に使用されていない、この時間だけ関数が戻る真陽性。 「」 '
1.3カエルジャンプステップの問題
参考ブログ: https://cloud.tencent.com/developer/news/44122
図1に示すように、二段階問題
問題:カエルは、クラス1レベルにジャンプすることができ、あなたはまた、レベル2に飛び乗っすることができます。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: N-リターン 他: リターンFIB + FIB(2-N-)(1-N-) プリント(FIB(4)。)5#。
#### 1、n = 1の場合にのみ、方法 #1、F(1)= 1の ときは#### 2、n = 2の最初のステップジャンプは、この方法は、最初の2つのホップがある場合プロセスステップがある場合 #1、F(2)= 1 1 + 2 = ####。3、最終的に押し下げる。3 = N-ジャンプステップは、F(N-1)を有するfの最後の2つのステップをジャンプ方法( 2-N-) #F(3)= F(2)+ F(1)。3 = ####。4、N-> 2 SO #のF(N)= F( N-1)+ F(N- 2)
2、nは階段の問題
問題:カエルは、クラス1レベルにジャンプすることができますが、また、レベル2に飛び乗っすることができます...... nはまた、ステージ上でジャンプすることができます。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: N-リターン 他: リターンFIB 2 *(N - 1) (FIB(4)。)を印刷8#。
#### 1、n = 1の場合にのみ、方法 #1、F(1)= 1の ときは#### 2、n = 2の最初のステップジャンプは、この方法は、最初の2つのホップがある場合ステップ一の方法 #F(N)= 1 1 + 2 = 最初のホップ、方法にレベルF(3-1)を有する####図3に示すように、最初のホップ= N-3そこF(3-2)は、2つの方法のステップは、F(3-3)がある場合、シードジャンプ最初のホップ三つのステップ #F(n-は)= 1 + 2 3 = ####。4、 N> 2というように #Fを(N)= F(N - 1)+ F(N - 2)+ ...... F(0) '' ' F(N)= F(N - 1) + F(N-2)+ ...... F(0) 種ジャンプ F(N-1)= F (N-2)+ F(N-3)+···F(0 ) F(N)-f(N - 1)= F(N - 1) その結果、F(
3、の3つの手順を発行
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: リターンN- のelif 。== 3 N-: リターン4。 他: リターンFIB +(-N-2)+ FIB(3-N-)FIB(1-N-) プリント7#(FIB(4))。
1.1再帰を説明します
1.定義
1.関数内、あなたは他の関数を呼び出すことができます。関数が自分自身の中に自分自身を呼び出す場合は、この関数は再帰関数です。
2、再帰的な性質
1.明確な終了条件が存在する必要があります
2.各エントリの再帰深く、問題の規模が前再帰と比較して低減されるべきです
3.再帰効率は高くはないが、再帰のあまりにも多くのレベルは、関数呼び出しを入力するたびに(コンピュータに、関数呼び出しが、このデータ構造のスタック(スタック)を介して達成され、スタックオーバーフローを引き起こすことができます
スタックは、関数戻り、毎回層スタックフレームを追加し、スタックは、一つのスタックフレームを減少します。スタックの大きさのためには無限ではないので、再帰呼び出しの数があまりにも多くのスタックオーバーフローが発生します)
1.2簡単な例は、再帰の原理を理解します
参考ブログます。https://www.cnblogs.com/Fantinai/p/7806356.html
1、再帰的なインスタンス
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - DEF digui(NUM): NUM印刷 :IF NUM> 0 digui(NUM - 1。) それ以外: 印刷「を------ ------ ' NUMプリント diguiを(3) ' ''の実行結果 。3 2 1 0 ------------ 0 1 2 3 '' '
1.たびに関数呼び出しの戻りがあり、一つは、代わりに(関数呼び出しの最初の部分で)メインに直接返すの1つ、再帰的に呼び出すことへの復帰です。
前記第1の再帰:N = 3 3 [3]の描画
前記第2の再帰:N = 2 2描画[3,2]
4。第3再帰:N = 1描画[3,2,1]
5. n = 0の場合、> 0がFalseではなく、再帰、印刷NUM = 0、機能彼のレベルで呼び出し元に戻る、すなわち、n = 1つのスタック
6.次に、位置digui(NUM - 1)下方を行う:印刷印刷NUM = 1、1スタック、スタック要素:[3,2]
7. 2、3、およびので、右の最終的な印刷を印刷します
2、解析結果
1.なぜそれ以上の成果でしょうか?忘れるために関数自体の後にコードを呼び出す考えているので、他の後にPythonコードです。
2.関数自体を呼び出すとき、コードが後に終了しますが、待っている状態ではありませんが、コードの実行後に、再度、対応する色で同じカラープリント()関数の文が待機Falseです。
あなたは再帰関数のdigui(3)を呼び出したときに、次のように3再帰関数を詳細、私は再帰関数分解を行うためにこれを入れてみましょう、実装プロセスは以下のとおりです。
1.2再帰的な階乗決意再帰的原則
1、コード階乗
#!/ usr / binに/ ENVのpython # - * -コーディング:UTF-8 - * - DEF試験(N): 1 == N場合: リターン1 他: RES = N *試験(N-1) の印刷「N:% S ----- RET:%S」%(N、RES) 戻りRESが 試験(4)#24印刷 ''」 2 ----- RET:N 2 、N:3 ----- RET: 6 N:4 ----- RET:24 24 ''」
#1、再帰的ステップ '' ' 1、第一の層(4)試験= *試験4(4-1)。 2、第二の層(3)試験*試験3 =(3-1) 。3、第層:試験(2)試験= 2 *(2-1) 。4、第四層:試験= 1(1)。 '' ' #2、ステップに戻る ' '' 注意:ユーバー位置である:RES = N *試験(N-1)、それは次に下方本明細書で知られている上部後方に戻りますが、リターンを実行する 5、N- =この時間の終わり第4層機能場合1は、コード・ブロック・リターン1のコードを実行する:RET = 1。 6、。第三の機能の第四の層位置の完了は、次に層まで行われた後のリターンを呼び出します。RET = * 2 1 。7、第3の層が第二層の折り返し位置の後にコールバック関数に戻ります:RET = 1 * 2 * 3 図8に示すように、第二層は、コールバック関数への最初の層のリターンの位置を戻します:RET = 1 * 2 * 3 * 4 コールは第一層の位置に達した後、上方位置は、再帰的に使用されていない、この時間だけ関数が戻る真陽性。 「」 '
1.3カエルジャンプステップの問題
参考ブログ: https://cloud.tencent.com/developer/news/44122
図1に示すように、二段階問題
問題:カエルは、クラス1レベルにジャンプすることができ、あなたはまた、レベル2に飛び乗っすることができます。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: N-リターン 他: リターンFIB + FIB(2-N-)(1-N-) プリント(FIB(4)。)5#。
#### 1、n = 1の場合にのみ、方法 #1、F(1)= 1の ときは#### 2、n = 2の最初のステップジャンプは、この方法は、最初の2つのホップがある場合プロセスステップがある場合 #1、F(2)= 1 1 + 2 = ####。3、最終的に押し下げる。3 = N-ジャンプステップは、F(N-1)を有するfの最後の2つのステップをジャンプ方法( 2-N-) #F(3)= F(2)+ F(1)。3 = ####。4、N-> 2 SO #のF(N)= F( N-1)+ F(N- 2)
2、nは階段の問題
問題:カエルは、クラス1レベルにジャンプすることができますが、また、レベル2に飛び乗っすることができます...... nはまた、ステージ上でジャンプすることができます。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: N-リターン 他: リターンFIB 2 *(N - 1) (FIB(4)。)を印刷8#。
#### 1、n = 1の場合にのみ、方法 #1、F(1)= 1の ときは#### 2、n = 2の最初のステップジャンプは、この方法は、最初の2つのホップがある場合ステップ一の方法 #F(N)= 1 1 + 2 = 最初のホップ、方法にレベルF(3-1)を有する####図3に示すように、最初のホップ= N-3そこF(3-2)は、2つの方法のステップは、F(3-3)がある場合、シードジャンプ最初のホップ三つのステップ #F(n-は)= 1 + 2 3 = ####。4、 N> 2というように #Fを(N)= F(N - 1)+ F(N - 2)+ ...... F(0) '' ' F(N)= F(N - 1) + F(N-2)+ ...... F(0) 種ジャンプ F(N-1)= F (N-2)+ F(N-3)+···F(0 ) F(N)-f(N - 1)= F(N - 1) その結果、F(
3、の3つの手順を発行
#!は/ usr / binに/パイソンのenv # - * -コーディング:UTF-8 - * - インポートSYSの は、sys.setrecursionlimit(1000000000)#設定再帰のシステムの最大深度 DEF FIB(N-): IFのn - <= 2: リターンN- のelif 。== 3 N-: リターン4。 他: リターンFIB +(-N-2)+ FIB(3-N-)FIB(1-N-) プリント7#(FIB(4))。