此代码是否会产生堆栈溢出?

时间:2012-12-27 17:49:29

标签: language-agnostic recursion stack-overflow

我偶然写了一些代码,其中包含了今天看起来的行:

public void fun1(args){
     fun2(args); 
}

public void fun2(args){
     fun1(args);
}

它是在Java中,因此当代码运行时,它会产生堆栈溢出并且代码崩溃。没问题。

但这是基于Java的,我也在其他语言中看到过这种情况(主要是OO或命令式语言)。是否有任何支持递归的语言,会导致堆栈溢出,但可能是不同的错误类型?或者“允许”无限循环无限期运行,也许有足够的内存?

3 个答案:

答案 0 :(得分:8)

是的,使用tail call optimisation的语言可以避免此情况下的堆栈溢出问题。例如,当调用以下函数之一时,以下Scheme代码将无限期执行:

(define (fun1 args)
    (fun2 args))

(define (fun2 args)
    (fun1 args))

答案 1 :(得分:0)

它进入内存的原因是因为运行时跟踪存储局部变量的上下文堆栈。每次输入方法时,都会在堆栈中添加新的上下文(技术上类似于Java的语言,每次遇到'{'

所以,基本上如果你想让它工作,你不需要上下文跟踪。汇编似乎是一个非常好的候选人。但它伴随着它自身的问题。

更好的是,为什么你会想要这样的东西......你可能想重新评估你在做什么......

答案 2 :(得分:0)

如果每次迭代不需要额外的内存,则无限循环并不总是导致崩溃。

无限递归并不总是导致崩溃,特别是如果它是尾递归并且取决于编译器/编程语言。

“Scheme”支持尾递归。