前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ANSI Common Lisp 第二章习题解答

ANSI Common Lisp 第二章习题解答

作者头像
mzlogin
发布于 2020-04-15 14:17:37
发布于 2020-04-15 14:17:37
1K00
代码可运行
举报
文章被收录于专栏:闷骚的程序员闷骚的程序员
运行总次数:0
代码可运行

本文是个人对第二章:欢迎来到 Lisp——ANSI Common Lisp 中文版 一文中习题的解答。

1. 描述下列表达式求值之后的结果:

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

答案:14

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

答案:(1 5)

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

答案:7

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

答案:(NIL 3)

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

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(cons 'a '(b c))
(cons 'a (cons 'b '(c)))
(cons 'a (cons 'b (cons 'c nil)))

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

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun get-forth(lst)
  (car (cdr (cdr (cdr lst)))))

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

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun get-max(x y)
  (if (< x y)
    y
    x))

5. 这些函数做了什么?

(a)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun enigma (x)
  (and (not (null x))
       (or (null (car x))
           (enigma (cdr x)))))

答案:判断 x 列表中是否有 nil 元素

(b)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun mystery (x y)
  (if (null y)
    nil
    (if (eql (car y) x)
      0
      (let ((z (mystery x (cdr y))))
        (and z (+ z 1))))))

答案:查找 x 在列表 y 中的下标,如果没有则为 nil

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

(a) > (car (x (cdr ‘(a (b c) d))))

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
B

答案:car

(b) > (x 13 (/ 1 0))

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
13

答案:or

(c) > (x #’list 1 nil)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1)

答案:or '(1)apply

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

答案:

非递归版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun has-child-list (lst)
  (let ((x nil))
    (dolist (obj lst)
      (setf x (or x (listp obj))))
    x))

递归版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun has-child-list-re (lst)
  (if (null lst)
    nil
    (if (listp (car lst))
      t
      (has-child-list-re (cdr lst)))))

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

a. 接受一个正整数,并打印出数字数量的点。

答案:

非递归版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun print-dots (n)
  (do ((i 0 (+ i 1)))
    ((= i n ) 'done)
    (format t ".")))

递归版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun print-dots-re (n)
  (if (= n 0)
    'done
    (progn
      (format t ".")
      (print-dots-re (- n 1)))))

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

答案:

非递归版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun print-a-times (lst)
   (let ((flag 'a)(x 0))
     (dolist (obj lst)
       (setf x (+ x (if (eql obj flag) 1 0))))
     x))

递归版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun print-a-times-re (lst)
  (if (null lst)
    0
    (let ((flag 'a))
      (+ (if (eql flag (car lst)) 1 0)
         (print-a-times-re (cdr lst))))))

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

(a)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun summit (lst)
  (remove nil lst)
  (apply #'+ lst))

答案:因为 remove 并不会改变 lst 本身。正确的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun summit (lst)
  (let ((newlst (remove nil lst)))
    (apply #'+ newlst)))

(b)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun summit (lst)
  (let ((x (car lst)))
    (if (null x)
      (summit (cdr lst))
      (+ x (summit (cdr lst))))))

答案:因为递归没有边界退出分支。正确的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defun summit (lst)
  (if (null lst)
    0
    (let ((x (car lst)))
      (if (null x)
        (summit (cdr lst))
        (+ x (summit (cdr lst)))))))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014/06/29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Lisp 学习资源集锦
http://acl.readthedocs.io/en/latest/zhCN/index.html
一个会写诗的程序员
2018/08/17
1.9K0
日拱一卒,伯克利教你用Lisp写递归,写完后我感觉代码更溜了
我们继续伯克利CS61A公开课之旅,这一次是它的第九次实验课。昨天的期中测试过后,这门课关于Python的编程基础以及面向对象的部分就算是讲完了,接下来就到了Scheme和数据处理的部分。
TechFlow-承志
2022/09/21
7190
日拱一卒,伯克利教你用Lisp写递归,写完后我感觉代码更溜了
日拱一卒,期末测试,伯克利61A完结篇
从四月初至今,经过了一个多月的漫长学习,我们终于迎来了它的尾声。说真的,从看视频,到写作业、做实验再到把相应的内容写成文章。这一步一步下来,我真的有一种重新回到课堂上课的感觉。即使之前学过Python,对算法也有一定的了解,这节课下来也依然收获满满。
TechFlow-承志
2022/09/21
5950
日拱一卒,期末测试,伯克利61A完结篇
日拱一卒,伯克利CS61A,居然有Lisp这样的语言……
我们继续来肝伯克利CS61A,今天我们看的是作业8。这一次的作业有些特殊,不再是基于Python,而是一门全新的语言Lisp。
TechFlow-承志
2022/09/21
1K0
日拱一卒,伯克利CS61A,居然有Lisp这样的语言……
Scheme语言实例入门--怎样写一个“新型冠状病毒感染风险检测程序” 1,表达式2,原子3,表(list) 4,点对(pair)5,向量(vector)6,变量7,
2020的春季中小学受疫情影响,一直还没有开学,孩子宅在家说想做一个学校要求的研究项目,我就说你做一个怎么样通过编程来学习数学的小项目吧,用最简单的计算机语言来解决小学数学问题。虽然我是一个老码农,但一直不赞成教小学生学编程,觉得这是揠苗助长,小学生不应该过早的固化逻辑思维而放松形象思维,某些少儿编程机构居然教学C++游戏编程,我觉得这真是在摧残祖国的花朵。现在孩子宅在家 ,想让他学点什么好几次冒出学编程的想法都被自己给否决了,直到我看到数学老师要求同学们整理小学阶段的数学公式、概念,我看到有一个小朋友居然画出了平面几何体的“继承”关系,让我眼前一亮:这种抽象关系如果用程序来表示不正合适吗?明白抽象方法了,那么学编程问题就不大了。于是我在想应该教孩子学什么语言比较好:LOGO、VB还是炙手可热的Python?虽然我非常熟悉C#,但需要了解许多背景知识,还需要安装一个很大的框架环境,显然C#不适合小学生学习,Java也是。LOGO是老牌的儿童编程语言了,操控一个小海龟来画图很形象,VB入门简单,但要一个小学生熟悉它的集成开发环境要求还是高了点,选Python无非就是因为AI应用火它就火,除此之外我找不出它适合儿童使用的理由。
用户1177503
2020/06/19
1.6K0
SCIP学习笔记
引言 SCIP(Structure and Interpretation of Computer Programs)[1]是MIT自1984年起的编程入门教程,尽管最近他们用Python的课程取代了Lisp语言,但是随着工业界越来越多的应用函数编程语言,如Clojure、Scala、Racket,以及软件开发使用并发的趋势(见文章[2]),重读SCIP是很有意义的。 SCIP分五章:构造过程抽象,构造数据抽象,模块化、对象和状态(涉及并发),源语言抽象,寄存器机器里的计算(编译器如何工作) 环境 OS
刘笑江
2018/05/28
1.7K0
Emacs Lisp
然后为了印证我的所学,我自己写了一个小函数,用于这篇文章中输入两个由 ~~~ 来标识的代码块
franket
2021/08/10
2.5K0
map的实现和柯里化(Currying)
  对于函数式编程来说,map/reduce/filter这几个算子非常重要,其中有的语言不是reduce而是fold,但功能基本一样,不过reduce的迭代一般只有一个方向,fold可能会分两个方向,这是题外话。
窗户
2019/09/29
9110
map的实现和柯里化(Currying)
Scheme来实现八皇后问题(2)
  上一章讲了用1~n的排序来表示n皇后的解,然后通过枚举1~n所有的排列、判定谓词过滤所有排列得到最终的所有解。
窗户
2018/10/25
7840
Scheme来实现八皇后问题(2)
日拱一卒,伯克利CS61A大作业,scheme 解释器(四)
我们来继续肝伯克利CS61A的scheme project,这是本project的第四篇,如果漏掉了之前的内容,可以去翻一下历史记录。
TechFlow-承志
2022/09/21
1.2K1
日拱一卒,伯克利CS61A大作业,scheme 解释器(四)
Lisp语言简介_c++是什么语言
摘自维基百科,原链接为:http://zh.wikipedia.org/zh/LISP
全栈程序员站长
2022/09/20
2.5K0
Scheme实现数字电路仿真(1)——组合电路
  EDA是个很大的话题,本系列只针对其中一小部分,数字电路的仿真,叙述一点概念性的东西,并不会过于深入,这方面的内容实则是无底洞。本系列并不是真的要做EDA,按照SICP里的相关内容,采用Lisp的方言Scheme。再者,Lisp并不是只有函数式一种编程范式,真正做EDA,仿真的核心部分为了运行效率可以采用C/C++编写,编程的思路也可以借鉴。
窗户
2019/12/16
1.1K0
Scheme实现数字电路仿真(1)——组合电路
日拱一卒,伯克利CS61A,这几题下来,我的Lisp写得更熟练了……
我们继续来肝伯克利CS61A,这次我们看的是作业9,同样是基于Lisp语言的几个编程问题。
TechFlow-承志
2022/09/21
5230
这真的是初三教科书里的概率题么?
将36个球放入标有 1,2,...,12 这 12个号码的 12 个盒子中,然后掷两枚质地均匀的骰子,掷得的点数之和是几,就从几号盒子中摸出一个球。为了尽快将球模完,你觉得应该怎样放球?
窗户
2018/12/12
1.1K0
这真的是初三教科书里的概率题么?
LeetCode题解-AddTwoNumbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
卡尔曼和玻尔兹曼谁曼
2019/01/22
4120
当我们谈论Monad的时候(二)
在上一篇文章中,我通过几个Java的例子简单的说明了Monad的本质和一些工程中常见的用途。接下来的文章就不再侧重于工程了,而是要慢慢向理论转换。而作为过渡,我选择了Haskell来代替Java进行说明。本篇文章默认读者已经对Haskell的基本语法有所了解,因此对此类内容我不会再做赘述。
KAAAsS
2022/01/14
9940
如何用Python编写一个Lisp解释器
这篇文章有两个目的:一是展示如何实现一个计算机语言的解释器,二是演示如何使用 Python 3 构造 Lisp 的一种方言 Schema,作者把自己的这个语言解释器称作 Lispy。几年前,作者曾展示过如何用 Java 和 Common Lisp 写 Schema 解释器。而本次的目的很纯粹,作者会尽可能简明扼要为大家进行介绍。
AI科技大本营
2019/08/15
1.5K0
如何用Python编写一个Lisp解释器
Extempore:实时系统的实时编程语言
介绍 Extempore 实时编程语言和环境,并详细探讨了使用 Extempore 演奏音乐的方法和技巧。
HaHack
2018/07/03
2.4K0
第二章· Redis管理实战
比如sina微博:在redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。 但是做了限制不能超过5000个ID,因此获取ID的函数会一只询问redis。 系统不会像传统方式那样“刷新”缓存,redis实例中的信息永远是一致的。 SQL数据库(或是硬盘上的其他类型数据)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
DriverZeng
2022/09/26
2740
Python 学习第二章
  这里说一下字符串拼接,在第一章的时候最后一张图显示出字符串拼接。这里我们演示一下怎么用,先看个简单的程序如下:
py3study
2020/01/19
3120
Python 学习第二章
相关推荐
Lisp 学习资源集锦
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档