Oz - 写一个更高效的函数
Oz - Write a more efficient function
如何以更有效的方式编写以下函数以减少递归调用的次数?
declare
fun {Calc N}
if N == 0 then 2
elseif N == 1 then 4
elseif N == 2 then 8
else {Calc N-1}+{Calc N-2}+{Calc N-3}
end
end
我想这就是您要找的:
declare
fun {Calc N}
fun {CalcAux N A B C}
if N==0 then A
else {CalcAux N-1 B C A+B+C}
end
end
in
{CalcAux N 2 4 8}
end
在你的版本中三个递归调用在一个语句中,它增加了对函数的调用次数,但也增加了每次计算语句时的执行堆栈大小。使用三个累加器(A、B、C)可以让我们每次进入CalcAux
函数时最多进行一次递归调用。
如何以更有效的方式编写以下函数以减少递归调用的次数?
declare
fun {Calc N}
if N == 0 then 2
elseif N == 1 then 4
elseif N == 2 then 8
else {Calc N-1}+{Calc N-2}+{Calc N-3}
end
end
我想这就是您要找的:
declare
fun {Calc N}
fun {CalcAux N A B C}
if N==0 then A
else {CalcAux N-1 B C A+B+C}
end
end
in
{CalcAux N 2 4 8}
end
在你的版本中三个递归调用在一个语句中,它增加了对函数的调用次数,但也增加了每次计算语句时的执行堆栈大小。使用三个累加器(A、B、C)可以让我们每次进入CalcAux
函数时最多进行一次递归调用。