首页 > 代码库 > SICP 习题 (2.18) 解题总结:反转列表

SICP 习题 (2.18) 解题总结:反转列表

SICP 习题 2.18 要求我们定义一个过程名叫reverse,可以将一个list反转过来。


比如 (reverse (list 1 4 9 16 25)) 的结果是:

(25 16 9 4 1)


这道题和之前的2.17有相似之处,都是对list进行遍历,然后做相应处理。不过2.17比较简单,遍历到最后面返回最后的元素就好了,2.18复杂一点,需要在遍历之后将list元素反向组装起来。


我们可以按以前的思路,通过递归来描述整个过程。


其实,(reverse (list 1 4 9 16 25))可以表示为

(append (reverse (list 4 9 16 25)) 1)

如此可以一直递归,直到reverse的参数只有一个元素为止。

 

对应的代码如下:

(define (reverse input-list)
  (if (null? (cdr input-list))
      input-list
      (append (reverse (cdr input-list)) (cons (car input-list) ‘()))))



SICP 习题 (2.18) 解题总结:反转列表