Javascript 用蹦床写阿克曼函数
my ackermann函数代码导致RangeError:超出最大调用堆栈大小。据我所知,使用Trampoline函数可以避免这个错误,但由于我是javascript新手,有人能帮助我了解如何使用Trampoline吗Javascript 用蹦床写阿克曼函数,javascript,recursion,Javascript,Recursion,my ackermann函数代码导致RangeError:超出最大调用堆栈大小。据我所知,使用Trampoline函数可以避免这个错误,但由于我是javascript新手,有人能帮助我了解如何使用Trampoline吗 ackermannCalc(m, n) { if (m === 0) { return n + 1; } else if (m > 0 && n === 0) { return this.ackermannCalc(m -
ackermannCalc(m, n) {
if (m === 0) {
return n + 1;
} else if (m > 0 && n === 0) {
return this.ackermannCalc(m - 1, 1);
} else if (m > 0 && n > 0) {
return this.ackermannCalc(m - 1, this.ackermannCalc(m, n - 1));
}
}
阿克曼不能被放在蹦床上是不真实的。所有纯函数都可以进行尾部递归,因此可以始终使用蹦床技术 仅仅因为阿克曼自己调用了两次并不妨碍我们对调用进行正确排序。一种方法是使用连续传球方式- 常量标识=x=> x const ack=m,n,k=identity=>{ 如果m==0 返回kn+1//tail 否则,如果m>0&&n==0 返回ackm-1,1,k//tail 其他的 返回ackm,n-1,r=>{//tail 返回ackm-1,r,k//tail } } 控制台logack3,2 // 29 控制台logack3,4
//RangeError:超过最大调用堆栈大小您是否进行过任何调试,就像在函数顶部放一个console.log来打印m和n的值一样?你得到了这个错误,因为在上一次检查m>0&&n>0时,你调用函数不正确,它将被无限调用,直到超过最大调用大小。我的理解和我很可能是错误的,那就是尾部递归只有在基元中才可能递归函数,而Ackermann函数是非原始函数。观看这段关于Ackerman函数的视频,你就会明白你不能@Ryu读了我的答案,你会明白你可以。谢谢你的建议,我会查回忆录的