[英]Haskell back tracking recursion
我在haskell中實現這個。
https://www.cs.bu.edu/teaching/alg/maze/
當達到“目標”時我能夠到達獲取列表但是如果目標不可訪問,則列表不會更新。 例如
...#@ !!!#@
..#.. !!#..
.##.# it should return !##.#
...#. !!!#.
我的代碼如下
path maze x y
| x >= length (head maze) = (False, maze)
| y >= length maze = (False, maze)
| x < 0 = (False, maze)
| y < 0 = (False,maze)
| check maze x y '+' = (False, maze)
| check maze x y '#' = (False,maze)
| check maze x y '!' = (False, maze)
| check maze x y 'G' = (True,maze)
| fst east = (True,snd east)
| fst south = (True, snd south)
| fst west = (True, snd west)
| fst north = (True, snd north)
| fst noWay = (True, snd noWay)
| otherwise = (False, maze)
where
noWay = path (changeVal maze x y '!') x (y+1)
north = path(changeVal maze x y '+') x (y-1)
south = path (changeVal maze x y '+') x (y+1)
east = path (changeVal maze x y '+') (x+1) y
west = path (changeVal maze x y '+') (x-1) y
我沒有得到結果。 我是Haskell的新手,任何人都可以給我一個提升,這樣我就可以解決這個愚蠢的問題。
你的問題的原因很快就會出現
| otherwise = (False, maze)
使用原始maze
而不是返回更新的maze
。 但是,即使用snd noWay
替換它也不會給你想要的輸出。 (我認為它只會與馬克!
S中的部分向南從你的出發點。)
存在一個更大的問題:當繼續下一個遞歸步驟時,您的函數不會保留上一步的標記,而是再次從原始maze
開始。 相反,下一個遞歸步驟需要從前一個產生的最終迷宮標記開始。 例如(看到你的守衛向東 - >南 - >西 - >北)你需要south
離開east
地方,有類似的東西
south = path (snd east) x (y+1)
如果你同樣修正所有方向,那么你不需要noWay
。 (在這一點上沒有任何未標記的地方可供檢查。)相反,如果north
案例失敗,那么它將標記除初始點以外的所有內容,所以你可以做
| otherwise = (False, changeVal (snd north) x y '!')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.