Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用蹦床写阿克曼函数_Javascript_Recursion - Fatal编程技术网

Javascript 用蹦床写阿克曼函数

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 -

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 - 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读了我的答案,你会明白你可以。谢谢你的建议,我会查回忆录的