ANSI Common Lisp Chapter 2 习题参考答案

1、描述下列表达式求值后的结果

(a) (+ (- 5 1) (+ 3 7))

14

(b) (list 1 (+ 2 3))

(1 5)

© (if (listp 1) (+ 1 2) (+ 3 4))

7

(d) (list (and (listp 3) t) (+ 1 2))

(nil 3)

2、给出3种不同表示(a b c)的cons 表达式。

(cons 'a '(b c))

(cons 'a (cons 'b '©))

(cons 'a (cons 'b (cons 'c)))

3、使用 car 与 cdr ,定义一个函数,它返回一个列表的第四个元素。

(defun four-ele (mylist)              
	(car (cdr (cdr (cdr mylist)))))

4、定义一个函数,接受两个参数,返回两者当中较大的那个。

(defun bigger (first second)                                                                          
	(if (> first second)                                                                              
		first                                                                                           
		second))      

5、这些函数做了什么?

(a)

(defun enigma (x)
  (and (not (null x))
       (or (null (car x))
           (enigma (cdr x)))))

判断一个列表是否含有 nil 元素,含有则返回 T,否则返回 nil

(b)

(defun mystery (x y)
  (if (null y)
      nil
      (if (eql (car y) x)
          0
          (let ((z (mystery x (cdr y))))
            (and z (+ z 1))))))

返回指定元素的下标,下标从 0 开始。

6、下列表达式, x 该是什么,会得到相同的结果?

(a)

(car (x (cdr '(a (b c) d))))

car

(b)

(x 13 (/ 1 0))

or

©

(x #'list 1 nil)

apply

7、只使用本章所介绍的操作符,定义一个函数,它接受一个列表作为参数,如果有一个 元素是列表就返回真。

(defun have-one-listp (x)
	   (if (null x)
	       nil
	       (if (listp (car x))
		     		t
		        (have-one-lisp (cdr x)))))

8、给出函数的迭代与递归版本:

a. 接受一个正整数,并打印出这么多数目的点。

迭代版本:

(defun print-point (maxnum)
  (dotimes (i maxnum)
    (format t ".")))

递归版本:

(defun print-point-fun (maxnum)
  (if (< maxnum 1)
      nil
      (progn
        (format t ".")
        (print-point-fun (- maxnum 1)))))

b. 接受一个列表,并返回 a 在列表中出现的次数。

迭代版本:

(defun exit-num (mylist)
  (let ((count 0))
    (dolist (obj mylist)
      (if (eql obj 'a)
          (setf count (+ count 1))))
    count))

递归版本:

(defun exit-num-fun (mylist)
  (if (null mylist)
      0
      (if (eql (car mylist) 'a)
          (+ 1 (exit-num-fun (cdr mylist)))
          (+ 0 (exit-num-fun (cdr mylist))))))

9、一位朋友想写一个函数,它返回列表中所有非 nil 元素的和。他写了此函数的两个版 本,但两个都不能工作。请解释每一个的错误在哪里,并给出正确的版本。

(a)

(defun summit (lst)
	((remove nil lst)
	(apply #'+ lst)) 

remove 是一个非破坏性函数,它返回去除 nil 元素的新列表。

正确版本:

(defun summit (lst)
  (setf lst (remove nil lst))
  (apply #'+ lst))

(b)

(defun summit (lst)
  (let ((x (car lst)))
    (if (null x)
        (summit (cdr lst))
        (+ x (summit (cdr lst))))))

递归没有结束条件,当遇到 nil 时无法正常过滤。

(defun summit (lst)
  (let ((x (car lst)))
    (if (null x)
        (summit (cdr lst))
        (+ x (summit (cdr lst))))))

正确版本:

(defun summit (lst)
  (if (not lst)
      (return-from summit 0))
  (let ((x (car lst)))
    (if (null x)
        (+ 0 (summit (cdr lst)))
        (+ x (summit (cdr lst))))))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值