2013-02-05 49 views
0

我學習haskell。我遇到了無法保存中間計算步驟的問題。這感覺無效。如何在函數式編程中使用動態編程?功能語言動態編程

+0

你可以使用延續和瓶蓋用於存儲中間值:http://en.wikipedia.org/wiki/Dynamic_programming_language#Functional_programming – Christian

+4

這個問題是過於抽象。你能給一個你想解決的具體問題嗎?獎金點,如果它是如此具體,實際上有一些代碼不能做你想做的。 –

+1

到目前爲止,我還沒有在Haskell中做過很多動態編程,但感覺就像懶惰和純潔會成爲你的朋友。只需構建一個代表中間值的數據類型(例如您的維特比晶格),並使用遞歸算法向其中填充值。 如果您提出更具體的問題,我可以嘗試幫助更多。 –

回答

6

我遇到[在Haskell],我不能保存中間 計算步驟的問題。

我不知道你用什麼資源來學習它,但它們顯然不是最好的。

例如:

let 
    intermediate = {- calculation step -} 
in ... 

保存在intermediate計算步驟的結果。 (更好:它的可變intermediate結合的價值。)

另外,舉相關的維基百科條目:

在數學,計算機科學,經濟學,動態規劃 是解決方法通過將它們分解爲 更簡單的子問題來解決複雜的問題。它適用於展示重疊子問題[1]和最佳子結構 (下面描述)的屬性的問題。如果適用,該方法比天真方法花費的時間少得多。

動態規劃背後的關鍵思想非常簡單。一般來說, 爲了解決一個給定的問題,我們需要解決 問題(子問題)的不同部分,然後結合子問題的解決方案 來達成一個整體解決方案。通常,這些子問題中的很多是 真的是一樣的。動態規劃方法試圖僅解決每個子問題一次,從而減少了計算次數:一旦計算出給定子問題的解決方案,它將被存儲或「備忘錄」:下一次相同的解決方案是需要的,它只是 擡頭。當重複子問題的數量隨着輸入大小的函數呈指數增長時,此方法尤其有用。

很明顯,這種解決問題的方式得到了Haskell的很好的支持。例如,在最簡單的情況下,可以攜帶一張地圖,這樣可以保留已經解決的子問題及其解決方案。更高級的方法可以使用State Monad。等等。