Haskell 累加器版本的递归

Haskell 累加器版本的递归,haskell,Haskell,我有一个accu版本的递归示例。 正常递归: fib n = if n== 0 then 1 else if n==1 then 1 else fib(n-1) + fib (n-2) fib n fibPOM n 1 1 fibPOM n f1 f2 = if n ==1 then f1 else fibPOM (n-1) (f1+f2) f1 累计递归: fib n = if n== 0 then 1 else if n==1 then 1 else fib(n-1) + fib

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

fib n = if n== 0 then 1 else if n==1 then 1 else fib(n-1) + fib (n-2) 
fib n fibPOM n 1 1 
fibPOM n f1 f2 = if n ==1 then f1 else fibPOM (n-1) (f1+f2) f1 
累计递归:

fib n = if n== 0 then 1 else if n==1 then 1 else fib(n-1) + fib (n-2) 
fib n fibPOM n 1 1 
fibPOM n f1 f2 = if n ==1 then f1 else fibPOM (n-1) (f1+f2) f1 
我也必须这样做(a^n递归):


但是我不知道我必须做什么才能得到一个^n累计递归

这里有一个提示:添加累加器参数
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开始:
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)
)