我想bernoulli:: Integer -> Rational在haskell中撰寫一個伯努利函式,使用以下演算法計算給定整數的伯努利數。

函式“frac”和“binom”用于計算定義中的二項式。這是我到目前為止:
fact :: Integer -> Integer
fact i = foldr (*) 1 [1..i]
binom :: Integer -> Integer -> Integer
binom n k = (fact n) `div` (fact k* fact (n-k))
bernoulli :: Integer -> Rational
bernoulli 0 = 1
bernoulli i = ((binom i j) * (bernoulli j)) / (j - i - 1) where j = i-1
我現在已經嘗試了幾次不同的時間,但要么遞回不起作用,要么產生的 Rational 是錯誤的。
uj5u.com熱心網友回復:
我在你的代碼中發現了三個問題:
- 括號中的
binom - 混合
Rational和Integer - 您的功能
bernoulli不是總和,而只是第一個成員
在我的代碼中,您可以看到我是如何處理這些問題的。
fact :: Integer -> Integer
fact i = foldr (*) 1 [1..i]
binom :: Integer -> Integer -> Integer
binom n k = (fact n) `div` ((fact k) * fact (n-k))
bernoulli :: Integer -> Rational
bernoulli 0 = 1
bernoulli n = sum [
toRational(binom n k) * (bernoulli k) / toRational(k - n - 1)
| k <- [0..(n-1)]
]
測驗:
map bernoulli [0..10]
輸出:
[1 % 1,(-1) % 2,1 % 6,0 % 1,(-1) % 30,0 % 1,1 % 42,0 % 1,(-1) % 30,0 % 1,5 % 66]
小補充:
如果我們不遵循利用現有庫的規則,解決方案也可能如下所示:
binom :: Rational -> Rational -> Rational
binom n k = product [ ( n 1 - i ) / i | i <- [ 1 .. k ] ]
bernoulli :: Rational -> Rational
bernoulli 0 = 1
bernoulli n = sum [
binom n k * bernoulli k / (k - n - 1)
| k <- [0..(n-1)]
]
因為:

注意程式與數學符號的相似性。
PSbernoulli有foldr:
bernoulli :: Integer -> Rational
bernoulli n = foldr (summand n) (0::Rational) [0 .. (n-1)]
where
summand n k s1 = s1 toRational(binom n k) * bernoulli k / toRational(k - n - 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374169.html
上一篇:緩慢檢查正確的輸入
