再帰とは何ですか?
名前が示唆するように、いわゆる再帰関数(又はメソッド)である次の最も単純な、自分自身を呼び出します。
public void text() {
text();
}
- それは簡単ですが、このに再帰関数出口を与えるようにしてください、それ以外の場合は、ループが無限になる、最終的な結果は、(メモリのうち)のOutOfMemoryであることが主な機能で呼び出された場合、それはスペースを積み重ねるようなエラーがいっぱいです。
- どのように再帰的な方法は、それをエクスポート書くには?
長い再帰的なプロセスとして、return文を持つ方法があるので、再帰再帰的方法終了しますが、もはやありません。
私たちは、メソッドへの復帰に条件を追加します。
private int count = 0;
/*
* 每次让count累加,当它等于4时,就返回,这样就能这个递归函数了
*/
public void text() {
if (count == 4) {
return;
}
count++;
text();
}
再帰的な使用は何ですか?
1.最も有名なペイフィボナッチ数列
以下のような問題がある:新生児ウサギのペアで最初の月とし、ウサギが二月満期が入り、3ヶ月の出生Iバニー後、ウサギの1ペアが小さなウサギの毎月の誕生を成熟します、ウサギは死ぬことはありません。。。n個の数ヶ月はしているどのように多くのウサギ
簡単初めの網羅ヶ月のウサギの数を計算するために使用することができます
月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
ウサギの対数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
- 分析の思考の問題を解決するために使用再帰:
:以下の式を得ることは容易である
; n = 0で,, 0ウサギ
; n = 1の場合、ウサギ1
が有する開始するための最初の3ヶ月であるため、N = 2、1匹のウサギバニー
N> 2、F. + F.(N)= F(1-N-)(2-N-)
場合は、上記の式で、我々は以下のコードを書くことは非常に簡単になります:
public static int brithNew(int n) {
if (n < 0) {
return -1;
}
if (n == 0) {
return 0;
}
//这个其实就是递归退出的条件,因为n一直的在递减
if (n <= 2) {
return 1;
}
return brithNew(n-1)+brithNew(n-2);
}
2.再帰を使用すると、迷路を解きます
まず、次のルールを二次元アレイ定義迷路を使用して:
- まず、この迷路のすべての位置を表すために0を使用します
- 最も外側の壁を示すために1を使用します
- この点を表現するために2を使っては来、スルーされています
- この点を通過されていないが、どこにも示すために使用3
以下に定義迷路:
赤の部分は第1の2次元アレイ定義迷路を使用して、右下に左上から、壁を示します。
private static void init(int[][] maze) {
//定义所有的墙
for (int i = 0; i < 10; i++) {
maze[0][i] = 1;
maze[7][i] = 1;
}
for (int i = 0; i < 8; i++) {
maze[i][0] = 1;
maze[i][9] = 1;
}
maze[3][1] = 1;
maze[3][2] = 1;
maze[3][3] = 1;
maze[5][3] = 1;
maze[5][4] = 1;
maze[5][5] = 1;
maze[4][5] = 1;
maze[3][5] = 1;
maze[2][5] = 1;
maze[1][5] = 1;
maze[2][7] = 1;
maze[3][7] = 1;
maze[4][7] = 1;
maze[5][7] = 1;
maze[6][7] = 1;
}
以下のように、この配列を印刷し、画像の上に:
そして、特に、以下の規則、パスを探し始めます
- 各点は、下部、右があり、あるいは、この順序は変更することができる4つのパスを残しました。
- 4つのシーケンス、異なる結果を交換し、今の最短経路を求めるこれら四つの順序を交換しようとすることは可能です
- 私たちは、この時点で到着したとき、我々はパスが正しいか、この点を前提とし、2を与えるために割り当てられ、
- 各小再帰終了条件は2、すなわち迷路[9] [7] == 2の最終値であります
- 道路がブロックされている場合、それは3に設定されているこの時点で、現在のでしょう
private static boolean searchRoute(int maze[][], int x, int y) {
int i = maze.length;
int j = maze[0].length;
if (maze[i - 2][j - 2] == 2) {
//目标点的值为2,就说明这条路已经走完了
return true;
} else {
if (maze[x][y] == 0) {//为0说明这这条可走,而且没有走过
maze[x][y] = 2;
//按照下、右、上、左的顺序
if (searchRoute(maze, x + 1, y)) {//向下
return true;
} else if (searchRoute(maze, x, y+1)) {//向右
return true;
} else if (searchRoute(maze, x - 1, y)) {//向上
return true;
} else if (searchRoute(maze, x, y - 1)) {//向左
return true;
} else {
maze[x][y] = 3;
return false;
}
} else {
return false;
}
}
}
コードはに使用される配列の上に印刷されています。
public static void printlnArr(int arr[][]) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
System.out.println();
}
}