再帰的な原則
再帰は、再帰的なプロセスにおいて、サブルーチン呼び出しとしての機能自体の問題を解決する効果的な方法であります
あなたは自分自身の関数を呼び出す方法を疑問に思うかもしれません。トリックは、再帰関数は自分自身を呼び出すたびにある、それはサブ問題を解体問題に与えられます。
子供再帰的な問題はさらにポイントを使わずに解決することが可能になるまで再帰呼び出しが続いています。
無限ループが発生しない再帰関数を確保するためには、以下の属性を持っている必要があります。
- シンプルな
基本案例(basic case)
(あるいは場合によっては) -答えを生成するために、再帰を使用することはできませんプログラムを終了します。---終了条件 - 呼ばれるルールのセットは
递推关系(recurrence relation)
、他のすべての場合において、ベースケースに分けることができます。---漸化式
関数が複数の場所が自分自身を呼び出す有することができることに注意してください。
例
のは、簡単なプログラミングの問題を見てみましょう:
逆の順序で印刷する文字列。
あなたは簡単に、文字列の最後の文字から文字列を横断し始めたこの問題を、解決するために反復的なアプローチを使用することができます。しかし、どのようにそれは再帰的にそれを解決するには?
まず第一に、我々はのために必要な機能を定義することができ 、最初の文字を表す文字列を。その後、我々は2つの段階で与えられたタスクを達成することができます。printReverse(str[0...n-1])
str[0]
printReverse(str[1...n-1])
:逆の順序で印刷したサブストリングstr[1...n-1]
。print(str[0])
:文字列の最初の文字を印刷します。
我々は最初のステップで関数自体を呼び出すことに注意してください、定義によって、それは再帰関数を作ります。
例:
プライベート 静的 ボイド printReverse(CHAR [] STR){ ヘルパー( 0 、STR); } プライベート 静的 ボイドヘルパー(int型のインデックス、CHAR [] STR){ IF(STR == NULL ||インデックス> = str.length){ リターン; } // これは、第1の出力電流文字インデックス(すなわち、指数+ 1)した後、インデックスとして理解することができ、バック出力、次の文字の出力電流となっているすべての文字の後にこの方法は、マクロとして理解することができる ヘルパー(インデックス+ 1 、STR) のSystem.out.print(STR [インデックス]); }
再帰の例:
まず、テキストを反転
問題:
関数を記述し、その役割は、入力文字列に逆転されます。文字列の入力列のchar []の形で与えられます。 別の配列に追加の領域を割り当てないでください、あなたはO(使用して、代わりに入力配列を変更する必要があります 1つの。この問題を解決するために余分なスペースを)。 あなたは、アレイ内のすべての文字がASCII表の印刷可能な文字であることを仮定してもよいです。
パッケージcom.example.demo。 パブリック クラスTestString0001 { 公共 ボイド reverseString(CHAR [] S){ int型のlen = s.length。 スワップ(S、 0、lenの- 1 )。 } プライベート ボイド(スワップのchar [] S、INT左、int型右){ 場合(>左右){ 返します。 } チャー一時= S [左]。 S [左] = S [右]。 S [右] =一時; スワップ(S、左、右1、+ 1 )。 } パブリック 静的 ボイドメイン(文字列[]引数){ TestString0001 T = 新しいTestString0001()。 CHAR [] ARR = { 'H'、 ''、 'N'、 'N'、 ''、 'H' }。 t.reverseString(ARR)。 用(チャーC:ARR){ のSystem.out.println(c)前記 } } }
第二に、問題
リンクされたリスト内のノードを切り替える二十個の
隣接ノードとリストペアワイズ交換を与えられ、そして交換にリストを返します。
あなたは、単に内部ノード値を変更しますが、実際のノード交換する必要がないことができます。
クラスソリューション{ パブリックListNodeのswapPairs(ListNodeヘッド){ 場合(ヘッド== NULL || head.next == NULL ){ 戻りヘッド。 } ListNodeのTEMP = ヘッド。 ヘッド = head.next。 temp.next = head.next。 head.next = 温度; // 下さい一个交换 head.next.next = swapPairs(head.next.next)。 リターンヘッド; } }
関連:再帰についてleetcode:
https://leetcode-cn.com/explore/featured/card/recursion-i/256/principle-of-recursion/1101/