Exercise 2.22. Louis Reasoner tries to rewrite the first square-list procedure of exercise 2.21 so that it evolves an iterative process:
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons (square (car things))
answer))))
(iter items nil))
Unfortunately, defining square-list this way produces the answer list in the reverse order of the one desired. Why?
Louis then tries to fix his bug by interchanging the arguments to cons:
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons answer
(square (car things))))))
(iter items nil))
This doesn’t work either. Explain.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (define nil '()) | |
| (define (square n) (* n n)) | |
| (define (square-list items) | |
| (define (iter things answer) | |
| (if (null? things) | |
| answer | |
| (iter (cdr things) | |
| (cons (square (car things)) | |
| answer)))) | |
| (iter items nil)) | |
| Explanation by substitution model. | |
| (define (square-list items) | |
| (define (iter things answer) | |
| (if (null? things) | |
| answer | |
| (iter (cdr things) | |
| (cons answer | |
| (square (car things)))))) | |
| (iter items nil)) | |
| ;; This doesn't work because the first argument to cons should not be a list, if we want to create a list. |