2.22

练习 2.22 Louis Reasoner试图重写练习2.21的第一个square-list过程,希望使它能生成一个迭代计算过程:

(define (square-list items)
    (define (iter things answer)
        (if (null? things)
            answer
            (iter (cdr things)
                    (cons (square (car things))
                            answer))))
    (iter items nil))

但是很不幸,在按这种方式定义出的square-list产生出的结果表中,元素的顺序正好与我们所需要的相反。为什么?

Louis又试着修正其程序,交换了 cons 的参数:

(define (square-list items)
    (define (iter things answer)
        (if (null? things)
            answer
            (iter (cdr things)
                (cons answer 
                    (square (cdr things))))))
    (iter items nil))

但还是不行。请解释为什么。


先跑一下Louis的第一个实现:

(define (square x) (* x x))

(define (square-list items)
    (define (iter things answer)
        (if (null? things)
            answer
            (iter (cdr things)
                    (cons (square (car things))
                            answer))))
    (iter items '()))

(square-list (list 1 2 3 4))

解释如图:

再来跑一下 Louis 的第二个实现:

(define (square-list-2 items)
    (define (iter things answer)
        (if (null? things)
            answer
            (iter (cdr things)
                (cons answer 
                    (square (cdr things))))))
    (iter items '()))

(square-list-2 (list 1 2 3 4))

可见,虽然修改参数的顺序的意图是对的,但是导致了 (cdr things) 是一个 list 不能传递给 square 过程。第一个实现中的 (car things) 是一个数,是可以传递的。

results matching ""

    No results matching ""