【发布时间】:2019-04-05 16:00:52
【问题描述】:
我最近看到一个关于 Ackermann 函数的有趣 Computerphile Video 并尝试在 R 中重新创建它,这就是我想出的:
Ackermann <- function(m,n){
if (m == 0){
return(n+1)
} else if (m > 0 & n == 0){
return(Ackermann(m-1,1))
} else if (m > 0 & n > 0){
return(Ackermann(m-1,Ackermann(m,n-1)))
}
}
在视频中,他们实现了自己的代码版本(我认为是 C 语言),并解释说对于特定值对(例如 4,1)需要大量递归计算,并且需要 3 分钟来计算那个值。如果我尝试用我的算法在 R 中重新创建它,我会得到堆栈溢出:
Error: C stack usage 7971652 is too close to the limit
有没有办法在 R 中获得 Ackermann(4,1) 的结果?
【问题讨论】:
-
R 没有以有效的方式进行尾递归(我认识到这不是真正的尾递归),因此它可以(如您所见)填满堆栈。有一些技术可以解决它,例如trampolines。当它不是真正的尾递归时(如在这个函数中),它们是有限的并且不能(如果我没看错的话)正确处理它。
-
stackoverflow.com/q/13208963/3358272 的可能重复项(由于其最终依赖于递归)。
标签: r recursion stack-overflow ackermann