無限ループが発生しない再帰関数を確保するためには、以下の属性を持っている必要があります。
- シンプルな
基本案例(basic case)
(あるいは場合によっては) -プログラムを終了する答えを生成するために、再帰を使用することはできません。 - 呼ばれるルールのセットは
递推关系(recurrence relation)
、他のすべての場合において、ベースケースに分けることができます。
1、逆の順序で印刷文字列
/ ** 输入:[ "H"、 "E"、 "L"、 "L"、 "O"] 输出:[ "O"、 "L"、 "L"、 "E"、 "H"] * / パブリッククラスPrintReverseDemo { パブリック静的無効メイン(文字列[] args){ printReverse( "APPLE" .toCharArray())。 } プライベート静的ボイドprintReverse(CHAR [] STR){ ヘルパー(0、STR)。 } プライベート静的ボイドヘルパー(int型のインデックスは、char型[] STR){ IF(ヌル== STR ||インデックス> = str.length){ 返します。 } ヘルパー(インデックス+ 1、STR)。 System.out.print(STR [インデックス])。 } }
リスト内の2つのスイッチングノード間の2、
/ ** *给定1-> 2->> 4 3-、你应该返回2-> 1-> 4 - > 3。 * / publicクラスSwapNodeDemo { パブリック静的無効メイン(文字列[] args){ ListNodeヘッド= makeListNode()。 System.out.println(ヘッド) System.out.println(swapPairs2(ヘッド))。 } / ** *递归 * @paramヘッド * @return * / パブリック静的ListNodeのswapPairs(ListNodeヘッド){ IF(ヘッド== NULL || head.next == NULL){ 戻りヘッド。 } ListNode P = head.next。 head.next = swapPairs(head.next.next)。 p.next =ヘッド。 Pを返します。 } / ** *非递归 * @paramヘッド * @return * / パブリック静的ListNode swapPairs2(ListNodeヘッド){ ListNodeダミー=新しいListNode(-1)。 dummy.next =ヘッド。 ListNode CURR =ダミー; 一方、(!curr.next = NULL && curr.next.next = NULL){ ListNode最初= curr.next。 ListNode第= curr.next.next。 //スワップ二つのノード first.next = second.next。 second.next =最初; curr.next =秒; //次の反復への更新 CURR = curr.next.next。 } dummy.next返します。 } パブリック静的ListNode makeListNode(){ ListNode 1 =新しいListNode(1)。 ListNode 2 =新しいListNode(2)。 ListNode 3 =新しいListNode(3)。 ListNode 4 =新しいListNode(4)。 one.next = 2; two.next = 3; three.next = 4; 1を返します。 }
3、パスカルの三角形
非負の整数を考えると numRowsの数、のパスカルの三角形前に生成 numRowsの数の ライン。パスカルの三角形では、各番号は、その左上と右上の数です。
公衆リスト<リスト>生成する(INT numRowsの数){ リスト<リスト>結果=新規のArrayList <>(); IF(numRowsの数<= 0){ リターン結果。 } ため(INT I = 1; I <= numRowsの数、iは++){ リストinnerList =新規のArrayList <>(); (INT J = 1; J <= I; J ++){ため innerList.add(F(I、J)); } result.add(innerList)。 } 戻り値の結果; } 公共のint F(整数I、整数j){ {(J == 1 || iがjは==)場合に 1を返します。 }他{ 戻りF(I-1、J-1)+ F(I-1、J)。 } }