累加器版本的递归

时间:2019-03-07 13:54:37

标签: haskell

我有一个递归的acc版本示例。 正常递归:

fib n = if n== 0 then 1 else if n==1 then 1 else fib(n-1) + fib (n-2) 

Accu递归:

fib n fibPOM n 1 1 
fibPOM n f1 f2 = if n ==1 then f1 else fibPOM (n-1) (f1+f2) f1 

而且我必须对此进行同样的操作(a ^ n递归):

ff a n = if n==0 then 1 else if n==1 then a else a * ff a (n-1)

但是我不知道我该怎么做才能获得a n递归。

2 个答案:

答案 0 :(得分:2)

这里有个提示:添加一个累加器参数acc

ff a n = ffACC a n (some initial accumulator value)

ffACC a n acc =
    if n==0      then ...
    else if n==1 then ...
    else  ...

确保在每个...中,所有递归调用都是尾调用。也就是说,返回ffACC (new a) (new n) (new acc),而不是类似value * ffACC ...的东西。

答案 1 :(得分:0)

您从初始值1:ff a n = ffAccu a n 1开始,然后将递归称为

ffAccu a n m = if n == 0 then m else (ffAccu a (n-1) (a*m))

(注意:if then else结构可以通过使用模式匹配来更简洁地编写,如

ffAccu a 0 m = m
ffAccu a n m = ffAccu a (n-1) (a*m)