2010-09-07 24 views
2

使用Data.Vector並且當前需要計算用於計算加密哈希(Sha1)的向量的內容。我創建了下面的代碼。使用Data.Vector進行動態編程

dynamic :: a -> Int -> (Int -> Vector a -> a) -> Vector a 
dynamic e n f = 
let 
    start = Data.Vector.replicate n e 
in step start 0 
where 
    step vector i = if i==n then vector 
        else step (vector // [(i,f i vector)]) (i+1) 

我建立這個使得函數f填寫矢量訪問沿途的局部 結果。當然這樣的事情必須已經存在於Data.Vector中,不是嗎?

問題說明如下:您要解決一個動態編程問題,其中最終結果是一個數組。你知道數組大小的大小,你有一個遞歸函數來填充它。

+0

最後一行中'n'是不是應該每次都是'i'? – sepp2k 2010-09-07 13:58:54

+0

@ sepp2k是的,謝謝!編輯。 – Questionable 2010-09-07 14:35:55

回答

8

你可能已經看到了功能generate,這需要一個尺寸nInt -> a類型的函數f,然後產生大小nVector a。你可能不知道的是,當使用這個函數時,你實際上可以訪問部分結果。

我的意思是說,在你傳遞給generate的函數中,你可以引用你定義的向量,並且由於Haskell的懶惰,它會正常工作(除非你使它成爲向量的不同項目當然,以循環方式相互依賴)。

實施例:

import Data.Vector 

tenFibs = generate 10 fib 
    where fib 0 = 0 
      fib 1 = 1 
      fib n = tenFibs ! (n-1) + tenFibs ! (n-2) 

tenFibs現在是包含第一個10張Fibonacci數的矢量。

+2

這是不可思議的。 – Questionable 2010-09-09 03:14:03