Haskell 累加器版本的递归
我有一个accu版本的递归示例。 正常递归: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
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)
)