帶有短路的摺疊我已經寫在Scala中一個簡單的深度優先搜索與這樣的一個遞歸函數:打破或Scala中
search(labyrinth, path, goal)
其中迷宮是問題的規範(如圖形或其他),路徑是一個列表,其中包含目前爲止所採用的路徑,目標是目標狀態的規範。如果找不到路徑,該函數將返回到目標的路徑爲List和Nil。
該功能擴展,例如,找到所有合適的下一個節點(候選),然後必須遞歸調用自己。
我這樣做是通過
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
請注意,我省略了一些細節unescessary。目前爲止一切正常。但是一旦在foldLeft調用中找到解決方案,這個解決方案就會被if語句的else部分簡單複製。有沒有辦法通過打破foldLeft或使用不同的函數而不是foldLeft來避免這種情況?其實我可以寫一個foldLeft版本,一旦「not Nil」自動返回就會破壞它。但是API裏面有一個嗎?
你想要完全避免什麼?沒有複製在任何地方發生。 – Apocalisp 2009-10-20 16:23:55
是不是他/她會爲列表中的每個剩餘項目發起至少一個函數調用? – 2009-10-20 16:37:55
隨着foldLeft,是的。但是,再次,foldLeft正在傾向於做一些它並不打算的事情。 – 2009-10-20 16:59:39