首页 文章

如何设置两个参数的递归函数的初始条件(Haskell)[重复]

提问于
浏览
4

这个问题在这里已有答案:

我正在努力学习一下Haskell For Great Good,并试图解决递归章节中的一些示例问题 .

我正在尝试编写一个带有下限“a”和上限“b”的函数,并返回两者之间所有数字的总和 .

我最初尝试(我认为是)一种直接的方法

sumInts :: Int -> Int -> Int
sumInts a a = a 
sumInts a b = (sumInts (a) (b-1)) + b

当我尝试编译时,我得到了一个错误声明

•'a'的定义冲突

我最终只想让这个东西起作用,所以我把应该是一个功能分成了两个 .

sumInts' :: Int -> Int
sumInts' 0 = 0
sumInts' a = sumInts' (a-1) + a


sumInts :: Int -> Int -> Int
sumInts 0 b = sumInts' b 
sumInts a b = (sumInts (a-1) (b)) - (a-1)

我试着寻找你认为会是一个非常简单的问题 . 唉,结果似乎太小众了 .

如何将我目前拥有的两个功能合并到一个功能中?另外,为什么我原来的功能不起作用?关于如何在将来避免这种情况的任何提示?谢谢!

2 回答

  • 0

    Haskell中的模式匹配是线性的 . 这意味着在函数的头部(模式匹配部分)中不能写入两次变量 . 所以你的条款:

    sumInts a a = a
    

    不被允许 . 在这种情况下,你可以 use guards

    sumInts :: (Num a, Ord a) => a -> a -> a
    sumInts a b | a <= b = a + sumInts (a+1) b
                | otherwise = 0
    

    警卫是管道角色之后的条件( | ) . 如果满足条件,则函数将评估等号右侧的部分( = ) . otherwise 只是 True 的别名 .

  • 3

    我知道问题是关于递归,但是只使用一个函数的最简单方法是根本不使用递归,而是使用简单的数学公式 .

    sumInts :: Int -> Int -> Int
    sumInts a b = ((a + b) / 2) * (b - a + 1)
    

相关问题