我必须以两种方式在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)
有人可以指出错误吗?
答案 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