遞迴:就是自己呼叫自己,然後一層層返回
乙個簡單的例子:
列印問題:
public
static
void
main
(string[
] args)
//列印問題
我們可以分析這個程式的執行過程:程式的方法在虛擬機器的棧空間執行
這就是遞迴的過程
有這樣乙個迷宮,從起點到終點,紅色是牆,黃色的是路,可以走,一次走一格
如何實現?
用陣列模擬迷宮,0表示路,1表示牆
111
1111
1000
0011
0001
0111
1010
1101
0101
1011
1011
0000
0111
1111
1
約定:0 為該點沒有走過 ;1 為牆;2為通路可以走;3表示該位置已經走過,但是走不通
/**
* @param map 迷宮地圖
* @param i,j 開始位置(i,j)
* @return 如果找到通路,就返回true,否則為false
** 使用遞迴回溯找到迷宮的路,設定終點為(6,5)
* 約定:0 為該點沒有走過 ;1 為牆;2為通路可以走;3表示該位置已經走過,但是走不通
* 策略:走迷宮時,策略為:下=》右=》上=》左,如果走不通再回溯
*/public
static
boolean
setway
(int
map ,
int i,
int j)
else
//向右走
elseif(
setway
(map,i,j+1)
)//向上走
elseif(
setway
(map,i-
1,j)
)//向左走
elseif(
setway
(map,i,j-1)
)else
}else
}}
測試:
public
static
void
main
(string[
] args)
//左右為1
for(
int i =
1;i <
7;i++
)//設定擋板
map[3]
[1]=
1;map[3]
[2]=
1;map[2]
[4]=
1;map[3]
[4]=
1;map[4]
[4]=
1;map[4]
[2]=
1;map[5]
[4]=
1;map[5]
[3]=
1;map[5]
[2]=
1;for(
int i =
0;i <
8;i++
) system.out.
println()
;}setway
(map,1,
1); system.out.
println
("===完成後的迷宮===");
從結果看到,迷宮程式走的路線是:
一路按照策略走
我們上面的策略是下右上左,當然還有其他策略
如上右下左等等,實現方法就是將上面的ifelse語句順序調換即可
/**
* @param map
* @param i
* @param j
* @return
** 修改策略的找路徑:上=》右=》下=》左
*/public
static
boolean
setway2
(int
map ,
int i,
int j)
else
//向右走
elseif(
setway2
(map,i,j+1)
)//向下走
elseif(
setway2
(map,i+
1,j)
)//向左走
elseif(
setway2
(map,i,j-1)
)else
}else
}}
這樣再測試就可以看到:
策略看自己的使用
乙個很複雜的迷宮問題,通過遞迴很簡單就解決了
遞迴是乙個很重要、很有用的思想,很多問題都可以通過遞迴解決
資料結構 迷宮(遞迴)
如下 include include using namespace std define max row 10 巨集定義行 define max col 10 巨集定義列 struct seat int x int y class maze void printmaze 列印迷宮 cout end...
資料結構 遞迴思想
一 漢諾塔 include stdio.h include stdlib.h void move int n,char x,char y,char z else int main 二 斐波那契數列 include stdio.h define maxsize 40 void iterfib void...
資料結構16 遞迴 迷宮問題
再把左右兩行都設定為1 for int i 0 i 設定擋板 map 3 1 1 map 3 2 1 輸出地圖 代表二維陣列的行數 for int i 0 i system.out.println system.out.println 小球走過的路線 使用遞迴回溯給小球找路 setway map,1...