在Haskell中的整个递归调用中维护变量

时间:2017-03-25 23:52:08

标签: variables haskell recursion

我想在Haskell中计算以下总和:(m + i)^ n从i = m到n。到目前为止,我已经想到了这个:

sum2017 m n 
|m > n = 0
|otherwise = (c + m)^n + sum2017 (m+1) n
where c = m

但问题是,由于从递归调用中分配了一个新值,c每次都会更改

2 个答案:

答案 0 :(得分:5)

您可以将实际递归填充到本地函数中,将mysqli_real_escape_string()绑定保留在外:

c

...当然,您可以完全省略sum2017 m = go m where go μ n | μ > n = 0 | otherwise = (c + μ)^n + go (μ+1) n c = m 并在递归中使用c = m

这个具体的例子也很容易完成,没有任何手动递归,比如

(m + μ)^n

答案 1 :(得分:1)

在Haskell中,您希望尽可能避免显式递归。

那你做什么呢?你使用为你做的循环函数;)

sum2017 m n = sum $ ((^ n) . (+ m)) <$> [m .. n]

或者您可以使用lambda函数代替此pointfree:(\ x - &gt;(c + x)^ n)

如果您决定将本地函数设置为leftaroundabout建议,则使其自行递归,而不是全局函数:

sum2017 m = go m
  where go μ n
    | μ > n     = 0
    | otherwise = (c + μ)^n + go (μ+1) n
    c = m

因为否则,它会很快失控/内存