我制作了这个尾递归函数来计算平方根:
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] 删除。
我来说两句