【发布时间】:2015-09-14 16:13:12
【问题描述】:
在学习 Racket 并开始进行一般编程时,我以两种不同的方式定义 ormap:
(define (or-map proc lst)
(cond
[(null? lst) #false]
[(proc (car lst)) #true]
[else (or-map proc (cdr lst))]))
(define (or-map proc lst)
(if (null? lst)
#false
(or (proc (car lst)) ; <-- this one
(or-map proc (cdr lst)))))
想到以下问题:
第二个尾调用优化了吗?我不确定注释行是否被丢弃(或 (or ...) 堆叠它的参数),因为如果它是 #true 函数调用结束,如果它是 #false 它应该是与 (or ...) 语句的进一步评估无关。
所以我运行了以下测试,并查看了任务管理器的内存使用情况:
(define (test)
(or #f
(test)))
(test)
记忆保持不变。所以我想我可以得出结论 (or ...*) 得到尾调用优化?我认为对于 (and ...*) 和其他布尔运算符保持不变,但是当我将 (test) 中的 or 更改为也不内存已满。
总之,是吗
- 到目前为止我的结论有一些错误吗?
- nor-test 发生了什么?
- 正确地假设我对 or-map 的两个定义在性能方面是等效的,还是一个比另一个更可取?
- (在这种情况下,我对任务管理器的使用是否合法?当内存填满 stackoverflow 时,我在其中看到的现象是什么?)
【问题讨论】:
标签: stack-overflow racket boolean-operations tail-call-optimization