說我有以下哈斯克爾樹類型,其中「國家」是一個簡單的包裝:如何在功能上生成寬度優先的樹。 (哈斯克爾)
data Tree a = Branch (State a) [Tree a]
| Leaf (State a)
deriving (Eq, Show)
我也有一個功能「展開::樹一 - >樹了」,這需要葉節點, 並將其展開爲一個分支,或者採用分支並將其保持不變。該樹類型表示一個N元搜索樹。
搜索深度優先是一種浪費,因爲搜索空間顯然是無限的,因爲我可以通過在所有樹的葉節點上使用擴展來輕鬆地擴展搜索空間,並且意外丟失的機會目標狀態是巨大的......因此唯一的解決方案是寬度優先的搜索,在here上實現得相當不錯,如果它在那裏,它將找到解決方案。
什麼我想要生成,但是,樹是遍歷高達找到解決方案。 這是一個問題,因爲我只知道如何做到這一點,這可以通過在第一個子節點上一次又一次地簡單地調用「擴展」函數來完成......直到找到目標狀態。 (這真的不會產生任何其他事情,然後一個真正不舒服的名單。)
任何人都可以給我任何提示如何做到這一點(或整個算法),或判斷是否有可能與體面的複雜性? (或者任何有關這方面的資料,因爲我發現很少。)
另一方面,您可能想在此處使用除「State」之外的其他名稱,因爲該名稱用於State monad的標準庫中,這可能會使人們感到困惑。 – 2010-05-15 04:38:16
我意識到,就在我使用State monad來實現我的算法時,根據這裏給出的建議。 – wen 2010-05-15 23:31:39