我正在做SICP 练习题2.28,并且遇到了以下代码的奇怪行为:
(define (fringe tree)
(cond
((null? tree) '())
((not (pair? tree)) (list tree))
(else (append (fringe (car tree)) (fringe (cdr tree))))))
(define (fringe-tail tree)
(define (fringe-iter tree result)
(cond
((null? tree) result)
((not (pair? tree)) (list tree))
(else (fringe-iter (cdr tree) (append result (fringe-tail (car tree)))))))
(fringe-iter tree '()))
(define x (make-list (expt 10 4) 4))
(time (fringe x))
(time (fringe-tail x))
普通的fringe
比其迭代版本fringe-tail
运行速度快得多:
cpu time: 4 real time: 2 gc time: 0
对比.
cpu time: 1063 real time: 1071 gc time: 191
看起来fringe
被优化成循环避免了任何分配,而fringe-tail
运行得更慢,花费时间创建和销毁对象。
有人能为我解释一下吗? (以防万一,我在使用Racket 5.2.1)