【问题标题】:Why does this recursive function for square-roots give the wrong result?为什么这个平方根的递归函数会给出错误的结果?
【发布时间】:2020-05-21 07:40:52
【问题描述】:

我制作了这个尾递归函数来计算平方根:

sqrt x n a = if n == 0 then a else sqrt x (n - 1) (a + x/a)/2

由于某种原因,当 n 大于 1 时,它会给出错误的结果,这意味着当它被要求改进近似 a 时,不止一次。随着 n 的增长,它返回一个越来越接近 0 的数字。我尝试以不同的方式实现相同的递归公式,如下所示:

sqrt x n = if n == 0 then 1 else (a + x/a)/2 where a = sqrt x (n - 1)

sqrt x = 1:map (\a -> (a + x/a)/2) (sqrt x)

而且一切正常。这只是第一个不起作用的示例,我不知道为什么,尽管我尝试了很多。

【问题讨论】:

  • 除法应用于sqrt的结果。

标签: haskell square-root


【解决方案1】:

表达式:

sqrt x n a = if n == 0 then a else  sqrt x (n - 1) (a + x/a)  / 2

被解析为:

sqrt x n a = if n == 0 then a else <b>(sqrt x (n - 1) (a + x/a))</b> / 2

因此sqrt x (n-1) (a+x/a) 被视为除以二的分子。您应该在此处添加括号:

sqrt x n a = if n == 0 then a else sqrt x (n - 1) <b>((a + x/a) / 2)</b>

有了给定的修正,我们可以例如计算五的平方根为:

Prelude> sqrt 5 10 1
2.23606797749979

根据Wikipedia,是:

2.23606797749978969640917366873127623544061835961152572427089…

所以这已经很接近了。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2020-08-02
    • 2019-10-29
    相关资源
    最近更新 更多