为什么此平方根的递归函数给出错误的结果?

托马斯·克林格勒

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

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 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 (sqrt x (n - 1) (a + x/a)) / 2

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

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

使用给定的fix,我们可以例如将五个的平方根计算为:

Prelude> sqrt 5 10 1
2.23606797749979

根据Wikipedia,它是:

2.23606797749978969640917366873127623544061835961152572427089…

所以这已经很接近了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章