这个尾递归Haskell函数的错误在哪里?

时间:2017-05-02 19:18:01

标签: haskell recursion functional-programming tail-recursion

我必须以两种方式在Haskell中实现sum函数。一个函数有尾递归,另一个没有尾递归。

这是没有尾递归的那个,它完美地运行

sum1 x = if x==0 then 0 else x + sum1(x-1)

这是我的尾递归尝试,它不起作用:

sum2 x = help 0 y
help x y = if y==0 then x else help(x+y,y-1)

有人可以指出错误吗?

1 个答案:

答案 0 :(得分:5)

你的专栏:

help x y = if y==0 then x else help(x+y,y-1)

不是调用函数的正确语法。因为这里Haskell编译器会将其解释为:

help x y = if y==0 then x else help (x+y,y-1)
--                                  ^ a tuple

相反,你应该写:

help x y = if y==0 then x else help (x+y) (y-1)
--                                  ^ two arguments

此外,您还可以使用警卫,例如:

helper x y | y == 0 = x
           | otherwise = help (x+y) (y-1)

最后sum2的第一行也有错误。它应该是x而不是y

sum2 x = help 0 x

完全,我们得到:

sum2 x = help 0 x
helper s x | x == 0 = s
           | otherwise = help (s+x) (x-1)

我还将y中的helper重命名为x,将x重命名为s(如s um),以减少sum2 = help 0令人困惑(感谢@Bergi对此发表评论)。

或使用 eta reduction

sum3 x = div (x*(x+1)) 2

最后请注意,您不需要递归。可以更快地运行的实现如下:

default_url_options

自:

 n
---
\       (n+1) n
/   i = -------
---        2
i=1