1

今日、次のような行を含むコードを誤って書きました。

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

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

それは Java であったため、コードを実行すると、スタック オーバーフローが発生し、コードがクラッシュしました。問題ありません。

しかし、これは Java に基づいており、他の言語 (ほとんどが OO または命令型言語) でもこれを見てきました。これによりスタック オーバーフローが発生せず、おそらく別のエラー タイプになる再帰をサポートする言語はありますか? または、おそらく十分なメモリを使用して、無限ループを無期限に実行できるようにしますか?

4

3 に答える 3

8

はい、末尾呼び出しの最適化を備えた言語は、この場合のスタック オーバーフローの問題を回避します。たとえば、次の関数のいずれかが呼び出されると、次の Scheme コードは無期限に実行されます。

(define (fun1 args)
    (fun2 args))

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

The reason it goes into memory is because the runtime keeps track of a context stack into which is stores the local variables. A new context is added to the stack every time you enter a method (technically in Java-like languages, every time it encounters a '{'

So, basically if you wanted this to work, you want no context tracking. Assembler seems like a very good candidate. But it comes with it's own problems.

Better yet, why would you ever want to so something like that... You might want to reevaluate what you are doing...

于 2012-12-27T18:00:51.650 に答える
0

Infinite loop does not always result in a crash if it does not require additional memory for each iteration.

Infinite recursion does not always result in a crash, especially if it is a tail recursion and depending on the compiler/programming language.

"Scheme" supports tail recursion.

于 2012-12-27T18:02:19.757 に答える