我正在阅读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
的长度。 (不使用任何折叠功能)?
答案 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)))))))