1

我不小心写了一些代码,其中包含今天看起来像这样的行:

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

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

它是在 Java 中的,所以当代码运行时,它产生了堆栈溢出并且代码崩溃了。那里没问题。

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

4

3 回答 3

8

Yes, a language with tail call optimisation will avoid the stack overflow problem in this case. For example, the following Scheme code would execute indefinitely when one of the following functions is called:

(define (fun1 args)
    (fun2 args))

(define (fun2 args)
    (fun1 args))
于 2012-12-27T17:59:25.143 回答
0

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

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

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

于 2012-12-27T18:00:51.650 回答
0

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

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

“方案”支持尾递归。

于 2012-12-27T18:02:19.757 回答