用于在方案中附加列表的迭代程序

时间:2016-02-15 11:39:41

标签: linked-list scheme sicp

我正在阅读SICP的2.2节,其中介绍了附加两个列表的程序。我正在尝试使用迭代实现追加。

这是我的代码:

(define (append list1 list2)
  (define (append-iter item1 reversed-item1 result)
    (if (null? item1)
      (if (null? reversed-item1)
        result
        (append-iter item1 
                     (cdr reversed-item1) 
                     (cons (car reverse) result)))
      (append-iter (cdr item1) 
                   (cons (car item1) reversed-item1) 
                   result)))
  (append-iter list1 '() list2))

虽然它有效,但注意迭代次数是list1长度的两倍。是否有一个解决方案,其迭代次数等于list1的长度。 (不使用任何折叠功能)?

1 个答案:

答案 0 :(得分:1)

基本上你的程序是如何运作的:

(define (append l1 l2)
  (define (reverse-append rev app)
    (if (null? rev)
        app
        (reverse-append (cdr rev) 
                        (cons (car rev) app))))
  (reverse-append (reverse l1) l2))   

它是O(N)但它浪费了一些内存,因为(reverse l1)空间仅用于迭代。如果你真的需要修复它,你需要使用变异:

(define (append-iter . rest)
  (let ((result (list 1)))
    (let loop ((p result) (lst '()) (rest rest))
      (cond
        ((not (null? lst))
         (set-cdr! p (list (car lst)))
         (loop (cdr p) (cdr lst) rest))
        ((null? rest) (cdr result))
        ((null? (cdr rest))
         (set-cdr! p (car rest))
         (cdr result))
        (else (loop p (car rest) (cdr rest)))))))