我是Haskell的初学者,我被困在一个简单的递归函数中。
我正在尝试定义一个函数rangeProduct,当给定自然数m和n时返回产品
M *(M + 1) ... 的第(n-1)* N
当n小于m时,该函数应返回0。
我尝试了什么:
rangeProduct :: Int -> Int -> Int
rangeProduct m n
| m > n = 0
| otherwise = m * n * rangeProduct (m+1)(n-1)
但是这是错误的,因为在其他防护中,当m变大且n变小时,在某个时刻m将变得大于n并且它将变为0导致它迄今为止所做的全部乘以零,从而得到每当我运行该函数时,在0中。
我知道答案很简单,但我被困住了。有人可以帮忙吗?谢谢!
答案 0 :(得分:2)
为什么要同时打扰递增和递减?走向一个方向:
rangeProduct m n
| m > n = 0
| m == n = n
| otherwise = m * rangeProduct (m + 1) n
虽然你可以很容易地定义它而不用递归
rangeProduct :: Integer -> Integer -> Integer
rangeProduct m n
| m > n = 0
| otherwise = product [m..n]