【发布时间】:2013-03-07 22:59:25
【问题描述】:
我正在尝试编写一个谓词,以递归方式找到某个数字的 n 次方 [A^n = A * A^(n-1)] 并使用快捷方式 A^(2n) = A^n * A^n。
这是目前的解决方案。
p(_,0,1):-!.
p(A,N,R):-N mod 2=0,!,N1=N/2,p(A,N1,R1),R=R1*R1.
p(A,N,R):-N1=N-1,p(A,N1,R1),R=R1*A.
现在我想让这个尾部递归。我可以为简单的情况做tail,例如没有捷径的阶乘和幂(通过添加一个累加器),但这很难。
非常感谢任何帮助!
【问题讨论】:
-
我认为这是不可能的。等着看有没有人知道方法...
-
@CapelliC 是否可以在没有累加器的情况下以尾递归方式进行阶乘和幂运算?
-
最初的问题不清楚:你的意思是你根本不想使用累加器,还是你想不出一种方法来合并你的快捷方式(A^2N = A ^N*A^N) 变成可以有累加器的尾递归解?
-
@Boris 后者。我知道我必须使用累加器进行尾递归,只是不知道如何合并快捷方式。
-
如果你有对数算法,通常把代码转换成TR形式就不太紧急。最大递归堆栈深度不太可能被破坏(防止堆栈溢出的可能性可能是试图完全避免线性递归的唯一/主要原因)。
标签: prolog exponentiation logic-programming