參考這篇關于Memoization的文章,我相信這種方法使用了 memoization,并且應該很快。但是,這里似乎并非如此:
pascal :: Int -> Int -> Integer
pascal a = (map ((map pascal' [0..]) !! a) [0..] !!)
where pascal' a b | a == 1 && b == 1 = 1
| a <= 0 || b <= 0 = 0
| otherwise = pascal (a-1) (b-1) pascal (a-1) b
Haskell 如何解釋這一點?如何使這個功能更快?
uj5u.com熱心網友回復:
您需要將(完整)資料結構的構建與資料結構中正確元素的選擇分開。
也就是說,您需要定義整個帕斯卡三角形:
triangle :: [[Integer]]
triangle = [[pascal' a b | b <- [0..]] | a <- [0..]]
where pascal' a b | a == 1 && b == 1 = 1
| a <= 0 || b <= 0 = 0
| otherwise = triangle !! (a-1) !! (b-1)
triangle !! (a-1) !! b
然后從三角形中的選擇將被記憶:
> triangle !! 100 !! 50
50445672272782096667406248628
>
定義資料結構并命名后,您可以定義一個用于訪問元素的函式:
pascal :: Int -> Int -> Integer
pascal a b = triangle !! a !! b
給記憶的電話:
> pascal 100 50
50445672272782096667406248628
您可以triangle進入where子句,給出完整的代碼:
pascal :: Int -> Int -> Integer
pascal a b = triangle !! a !! b
where
triangle = [[pascal' a b | b <- [0..]] | a <- [0..]]
pascal' a b | a == 1 && b == 1 = 1
| a <= 0 || b <= 0 = 0
| otherwise = triangle !! (a-1) !! (b-1)
triangle !! (a-1) !! b
即使編譯未優化或加載到 GHCi 中,它也應該可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474031.html
