我有一个递归的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递归。
答案 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)
)