这会产生堆栈溢出吗?

Will this produce 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, ....

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

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