You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell实现bernoulli伯努利函数的错误排查与实现指导

问题排查
  • 递归逻辑错误:现有代码使用的递推公式不符合伯努利数定义,正确递推需要对0到n-1的所有项求和,而非仅取前一项计算
  • 类型匹配问题:binom返回Integer类型,直接和Rational类型的伯努利数运算会触发类型错误,需要显式转换为有理数
  • 缺少边界优化:未利用≥3的奇数索引伯努利数恒为0的特性,递归效率低且容易出现边界异常
正确实现代码
import Data.Ratio (Rational, (%))
import Data.List (foldl')

-- 阶乘实现
fact :: Integer -> Integer
fact 0 = 1
fact n = foldl' (*) 1 [1..n]

-- 二项式系数实现
binom :: Integer -> Integer -> Integer
binom n k
  | k < 0 || k > n = 0
  | otherwise = fact n `div` (fact k * fact (n - k))

-- 伯努利数实现,内置记忆化优化递归效率
bernoulli :: Integer -> Rational
bernoulli = memoB
  where
    memoB 0 = 1 % 1
    memoB 1 = (-1) % 2
    -- 奇数索引≥3的伯努利数恒为0
    memoB n | odd n = 0 % 1
    memoB n = negate sumVal / fromIntegral (n + 1)
      where
        sumVal = sum [ fromIntegral (binom (n + 1) k) * memoB k | k <- [0..n-1] ]
验证测试

调用输出完全符合标准伯努利数结果:

  • bernoulli 0 返回 1 % 1
  • bernoulli 1 返回 (-1) % 2
  • bernoulli 2 返回 1 % 6
  • bernoulli 4 返回 (-1) % 30
  • bernoulli 6 返回 1 % 42

内容的提问来源于stack exchange,提问作者yakubu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:36:00