2016-10-07 8 views
0

次の再帰関数のコードは、無限大になる整数(正と負の両方)の出力を与えます。最終的にスタックオーバーフローにつながるでしょうか?そうでなければ、コンピュータはどのようにして最終的にクラッシュするでしょう(f)スタックオーバーフローが発生しますか?

(define(f) 
    (let loop ((i 0)) 
    (printf "~a, ~a, " i (- -1 i)) 
    (loop (add1 i)))) 

出力:

0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, 8, -9, 9, -10, 10, -11, 11, -12, 12, -13, 13, -14, 14, -15, 15, -16, 16, -17, 17, -18, 18, -19, 19, -20, 20, -21, 21, -22, 22, -23, 23, -24, 24, -25, 25, -26, 26, -27, 27, .... 

答えて

3

スキームは、あなたのコードは、スタックオーバーフローを生成することはありません末尾呼び出しの最適化を保証しているので。

iが非常に大きくなって、使用可能なメモリの大部分を消費すると、ヒープスペースが不足しているため、プログラムがメモリ不足エラーで停止します。その前に、仮想マシンの使用を開始したことが予想されていて、ディスクをかなり大きく交換していて、おそらく何かに応答するのが非常に遅いです。私のマシンでは、ある時点で2つのサイズがほぼ同じであるため、iは失敗する前に約140億の10進数で表示されます。

+0

明確かつ十分に説明された回答をありがとう。 – rnso

関連する問題