【问题标题】:Bernoulli function in HaskellHaskell 中的伯努利函数
【发布时间】:2021-12-01 14:33:33
【问题描述】:

我想在 haskell 中编写一个伯努利函数bernoulli:: Integer -> Rational,使用以下算法计算给定整数的伯努利数。

函数“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 错误。

【问题讨论】:

  • 向我们展示代码
  • 您可以发布带有代码的电线关联吗?现在它读作“出了点问题”,含糊不清。
  • 请注意,binom 的这种定义是非常低效的。分数中的大多数项取消。实际计算阶乘几乎从来都不是一个好主意,而是只对不取消的项进行乘积。

标签: haskell bernoulli-numbers


【解决方案1】:

我在你的代码中发现了三个问题:

  1. binom 中的括号
  2. 混合Rational 和Integer
  3. 您的函数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)]
  ]

因为:

注意程序与数学符号的相似性。

附言bernoulli 与 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)

【讨论】:

  • 括号大多是多余的。
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2020-12-17
相关资源
最近更新 更多