簡體   English   中英

Haskell回溯跟蹤遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM