这个死循环的代码会不会导致栈溢出?
Will this endless loop code cause stack-overflow?
我想连续 运行 一个程序,直到用户使用 control-C 停止它或关闭 window。下面的循环会导致内存栈溢出还是尾优化递归?
(define (f)
(let loop ()
(println "In loop.")
(sleep 1)
(loop)))
(f)
还有,下面是一样的还是有什么不同?
(for ((i (in-naturals)))
(println "In for loop")
(sleep 1))
方案标准对尾调用优化有要求。原因是语言中没有其他循环结构。你有 do
等,但如果你阅读报告,它们是类似递归过程的语法糖。
Racket,如#lang racket
,与标准方案共享这一点,以便第一个尾递归代码永远不会导致内存使用过多或堆栈溢出。
第二种是 #lang racket
特定的特殊形式,它仍然是递归过程的语法糖,就像 do
一样,它也不会堆栈溢出,但理论上该数字有可能变得比您的系统可用内存大并出现内存不足错误。由于你的一秒钟延迟,这在地球的生命周期内不会发生,因此停电或系统硬件故障等外部因素更有可能结束你的 运行 递归循环。
我想连续 运行 一个程序,直到用户使用 control-C 停止它或关闭 window。下面的循环会导致内存栈溢出还是尾优化递归?
(define (f)
(let loop ()
(println "In loop.")
(sleep 1)
(loop)))
(f)
还有,下面是一样的还是有什么不同?
(for ((i (in-naturals)))
(println "In for loop")
(sleep 1))
方案标准对尾调用优化有要求。原因是语言中没有其他循环结构。你有 do
等,但如果你阅读报告,它们是类似递归过程的语法糖。
Racket,如#lang racket
,与标准方案共享这一点,以便第一个尾递归代码永远不会导致内存使用过多或堆栈溢出。
第二种是 #lang racket
特定的特殊形式,它仍然是递归过程的语法糖,就像 do
一样,它也不会堆栈溢出,但理论上该数字有可能变得比您的系统可用内存大并出现内存不足错误。由于你的一秒钟延迟,这在地球的生命周期内不会发生,因此停电或系统硬件故障等外部因素更有可能结束你的 运行 递归循环。