當你看到遞迴時,如果腦子裡想著迴圈,一層層向下呼叫,一層層回溯,總想著計算機的每一步是怎麼做的,這樣就會陷入學習遞迴的思維誤區;
正確的做法是什麼呢?(遮蔽遞迴細節)
假設a問題,可以細分為bcd這三個小問題,那麼我們就應該考慮bcd這三者怎麼解決,然後能解決之後再考慮bcd和a的關係;
例:如果要解決我坐在電影院第幾排,那麼就可以分成規模更小的問題,然後問題就成為了很多個前一排在哪一排的問題;求解自己在哪一排的思路和前面一排的人求解的思路一樣
1.寫出遞推公式(找到如何將大問題分解為小問題的規律,基於此寫出遞推公式)
2.找到終止條件
(注:如果沒有終止條件,遞迴就成為了死龜了?)
思路:1.使用乙個二維陣列代表迷宮,數字1代表牆,2**通路,3代表死路 ,0代表還未走過
2.走的策略:下-右-上-左
3.如果走到某個點不通,就將該點標記為3;然後返回false,棧頂就會彈出乙個方法,所以會回退到上一步
**
package com.company;
/** * @author:抱著魚睡覺的喵喵
* @date:2021/2/21
* @description:
*/public
class
maze
for(
int j =
0; j <
9; j++
) maze[2]
[2]=
1;//額外為迷宮加入兩個牆作為障礙
maze[2]
[1]=
1;for(
int i =
0; i <
9; i++
) system.out.
println()
;}getpath
(maze,1,
1); system.out.
println
("路徑如下:");
for(
int i =
0; i <
9; i++
) system.out.
println()
;}}/**
* 迷宮的行走策略:下-右-上-左
* @param map
* @param x
* @param y
* @return
*/public
static
boolean
getpath
(int
map,
int x,
int y)
else
elseif(
getpath
(map, x, y+1)
)elseif(
getpath
(map, x-
1, y)
)elseif(
getpath
(map, x, y-1)
)else
}else}}
}
願你孤獨的努力都有回報,願你前行的路上有人陪伴~
一起加油哈?
使用遞迴回溯解決迷宮問題
目的 從左上角走到右下角。地圖用陣列表示,0表示可走,1表示牆,2表示已走過 不能再走 3表示已走過但走不通。策略 向下 向右 向上 向左 初始地圖 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0...
遞迴 回溯 裝載問題
之前討論了最優裝載問題的貪心演算法,這裡討論最優裝載問題的乙個變形。1 問題描述 有一批共n個貨櫃要裝上兩艘載重量分別為c1和c2的輪船,其中貨櫃為wi,且 要求確是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船?如果有,找出一種裝載方案。例如,當n 3,c1 c2 50,且w 10,40,40...
有趣的迷宮問題(遊戲) 遞迴回溯演算法詳解
3 迷宮解決 4 迷宮遊戲 完整 傳送門 全國大學生計算機技能應用 2020年 c 科目決賽程式設計題解 迷宮問題簡介 現有乙個n n的方格迷宮圖,相當於二維陣列,初始化中值為2表示 牆壁 值為0表示可走空地。現在給定入口位置 starti,startj 出口位置 endi,endj 設計一種演算法...