我正在尝试将从1到非常大的数字(目前为10 ** 9)的所有n相加,但它会导致堆栈溢出。此外,我认为在1处停止并将n分别求和不是最有效的方法,但下面的代码是我对Haskell的全部了解。我真的不太了解函数式编程,希望能提供尽可能多的解释。(我也尝试在最后一行放置$!严格,这是其他地方告诉我的,但没有改变任何东西。如果您能解释我可以执行此递归函数的最有效方法,我会很高兴。)
main :: IO()
summ 1 = 1
summ n = 1/(n**2) + summ (n-1)
expected_value = pi*pi/6
errorPercent n = n / expected_value * 100
main = do
putStr "%"
print (errorPercent (summ $! (10**9)))
summ
写成summ n = sum [ 1 / i^2 | i <- [1..n] ]
。很不错,对吧?(记得使用优化编译) - luquisum [ 1 / i^2 | i <- reverse [1..n] ]
来避免精度损失。 - Omnifarious