小编ask*_*ske的帖子

在Racket中进行尾调用优化

我正在做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))
Run Code Online (Sandbox Code Playgroud)

普通fringe运行速度比其迭代版本快得多fringe-tail:

cpu time: 4 real time: 2 gc time: 0
Run Code Online (Sandbox Code Playgroud)

cpu …
Run Code Online (Sandbox Code Playgroud)

scheme garbage-collection tail-call-optimization racket

4
推荐指数
1
解决办法
608
查看次数