这会产生堆栈溢出吗?

时间:2016-10-07 08:47:15

标签: scheme racket stack-overflow

下面的递归函数代码给出了整数(正数和负数)的输出,直到无穷大。它最终会导致堆栈溢出吗?否则,计算机将如何最终崩溃?

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

(f)的输出:

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, ....

1 个答案:

答案 0 :(得分:3)

因为Scheme保证了尾部调用优化,所以代码永远不会产生堆栈溢出。

i变得如此之大以至于它消耗了大部分可用内存时,程序将因内存不足而停止内存错误。在此之前,您可能已经开始使用虚拟内存来展示您的计算机并且正在非常频繁地交换磁盘,并且在响应任何内容时可能非常慢。在我的机器上,由于我们在任何给定时刻都有两个几乎相同的大小,我猜i在失败之前会有大约140亿个十进制数字。