首页 > 代码库 > SICP 习题 (2.22)解题总结: 迭代过程中的列表处理
SICP 习题 (2.22)解题总结: 迭代过程中的列表处理
SICP 习题 2.22是习题2.21的后续题目,题目中讲到叫Louis Reasoner的人想重写suqare-list过程,希望使用迭代计算过程,而不是递归计算过程,有关迭代计算过程和递归计算过程,如果你没什么印象了,请翻回习题1.9 的解题总结看看。
那个叫Louis Reasoner的人写的迭代版的suqre-list是这样的:
(define (square-list-revert items) (define (iter things answer) (if (null? things) answer (iter (cdr things) (cons (square (car things)) answer)))) (iter items ‘()))
然后他发现这个过程有些问题,所有平方数的顺序反了。
于是他又将过程改成这样:
(define (square-list-revert-2 items) (define (iter things answer) (if (null? things) answer (iter (cdr things) (cons answer (square (car things)))))) (iter items ‘()))
结果还是不对,这次返回的平方数的顺序是对了,不过格式有问题,没有形成一个列表,而是形成了一个嵌套的列表。。。。
题目要求我们解释为什么。
如果把以上的返回值打印出来,我觉得很多程序员都会明白是为什么:
1 ]=> (square-list-revert-2 ‘(1 2 3 4)) ;Value 2: ((((() . 1) . 4) . 9) . 16)
可以看到,Louis其实是将() 和 1 连接在一起,应为后面没有nil,所以这个变成了一个序对(() . 1),然后又将序对(() . 1) 和 4 连接起来,继续形成新的序对。。。。。
最后,如果一定要使用Louis的代码进行修改,完成相同的功能的话,可以使用append过程代替cons过程,将代码写成这样:
(define (square-list-revert-right items) (define (iter things answer) (if (null? things) answer (iter (cdr things) (append answer (list (square (car things))))))) (iter items ‘()))
不过,如果我们考虑的是效率的话,使用append并不是一个好主意,大家可以想一想为什么。
SICP 习题 (2.22)解题总结: 迭代过程中的列表处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。