我嘗試通過使用高階函數重新創建階乘函數,例如fac 1 = 1,fac 2 = 2,fac 3 = 6,但我沒有太多運氣。無論我給它什麼輸入,我的摺疊函數都會返回空列表。誰能幫我嗎?haskell:使用高階函數的階乘
這是我到目前爲止有:
fold f a [] = []
fold f a (x:xs) = fold f (f a x) xs
fac n = fold (*) 1 [1..n]
我嘗試通過使用高階函數重新創建階乘函數,例如fac 1 = 1,fac 2 = 2,fac 3 = 6,但我沒有太多運氣。無論我給它什麼輸入,我的摺疊函數都會返回空列表。誰能幫我嗎?haskell:使用高階函數的階乘
這是我到目前爲止有:
fold f a [] = []
fold f a (x:xs) = fold f (f a x) xs
fac n = fold (*) 1 [1..n]
fold
因爲它的基本情況返回空列表返回空列表,以及遞歸步驟做任何事都要用遞歸的結果。顯然,這些東西至少一個需要改變,而在這種情況下,這應該是基本情況:
fold f a [] = a
或者,你可以只使用foldl
本身,而不是試圖重新實現它。
您可以生成所有因子值作爲列表。
facts = scanl (*) 1 [1 ..]
之後得到一個值只是訪問列表。
factN n = facts !! n + 1
λ> factN 6
720
配備摺疊在一個列表,你可以實現它:
fact n = foldl1 (*) [1..n]
這個怎麼樣?
fac n=product [1..n]
您是否嘗試過在幾個樣本上手動執行它? –
這個練習是否需要重新創建'foldl'? – jwodder