ANSI Common Lisp Practice - My Answers - Chatper - 3
Ok, Go ahead.
1
(a)

(b)

(c)

(d)

2
注:union 在 Common Lisp 中的作用就是求两个集合的并集。但是这有一个前提,即给的两个列表已经满足集合的属性了。具体的操作过程似乎是对第一个 list 中的每一个元素在第二个 list 中查找,如无则标记一下;待第一个 list 的所有元素在第二个 list 中查完以后将所有标记过的元素放入一个 list 中与第二个 list 进行合并。这意味着,如果刚开始给的两个 list 不完全满足集合的属性,则会有重复出现。本题依照这种思路来完成。
(defun new-union (lst1 lst2)
(let ((tmplst '()))
(dolist (obj lst2)
(if (not (member obj lst1))
(setf tmplst (append tmplst (cons obj '())))
nil))
(append lst1 tmplst)))
3
(defun occurrences (lst)
(let ((tmplst '()))
(dolist (obj lst)
(if (assoc obj tmplst)
(setf tmplst (addcount obj tmplst))
(setf tmplst (append tmplst (cons (cons obj 1) nil)))))
(sort tmplst #'(lambda (lst1 lst2) (> (cdr lst1) (cdr lst2))))))
(defun addcount (obj tmplst)
(let (reslst '())
(dolist (xobj tmplst)
(if (equal (car xobj) obj)
(setf reslst (append reslst (cons (cons obj (+ (cdr xobj) 1)) nil)))
(setf reslst (append reslst (cons xobj '())))))
reslst))
4
'(a) 不是 atom,'a 才是 atom。而 member 是采用 eql 判断相等,不是用 equal。个人感觉 (remove '(a . 2) '((a . 2) (b . 3))) 达不到效果也是这个原因。
P.S. 后来在读到第四章时发现,这个问题可以添加 关键字参数 :test #'equal 来解决。(英文版 67 页)
5
; iteration
(defun pos+1 (lst)
(let ((tmplst nil) (n 0))
(dolist (obj lst)
(setf tmplst (append tmplst (cons (+ obj n) nil)))
(setf n (+ n 1)))
tmplst))
; recursion
(defun pos+2 (lst)
(wtf lst 0))
(defun wtf (lst n)
(if (null lst)
nil
(cons (+ (car lst) n) (wtf (cdr lst) (+ n 1)))))
; mapcar (In fact, I also use iteration to create a list from 0 to n-1...)
(defun pos+3 (lst)
(mapcar #'+ lst
(let ((tmplst nil) (n 0))
(dolist (obj lst)
(setf tmplst (append tmplst (cons n nil)))
(setf n (+ n 1)))
tmplst)))
6
注:第一个 cons 的改写不太明白怎么做。cons 已经是基本的操作符之一了。另外第三个 list 的改写需要用到后面的函数接受不定参数。根据知识屏蔽原则,先标记上,将来学到那里了再反过头来补上。再,刚开始定义的 cdr-x 和 car-x 均为题中“政府”制定的 cdr 和 car。
(defun cdr-x (lst)
(car lst))
(defun car-x (lst)
(cdr lst))
(defun cons-new (obj lst)
())
(defun length-new (lst)
(if (null lst)
0
(+ 1 (length-new (car-x lst)))))
(defun member-new (obj lst)
(if (null lst)
nil
(if (eql obj (cdr-x lst))
lst
(member-new obj (car-x lst)))))
7
仅仅修改了 n-elts 函数,使之返回一个 dotted list 而不是一个 proper list
; modified version
(defun compress-m (x)
(if (consp x)
(compr-m (car x) 1 (cdr x))
x))
(defun compr-m (elt n lst)
(if (null lst)
(list (n-elts-m elt n))
(let ((next (car lst)))
(if (eql next elt)
(compr-m elt (+ n 1) (cdr lst))
(cons (n-elts-m elt n)
(compr-m next 1 (cdr lst)))))))
(defun n-elts-m (elt n)
(if (> n 1)
(cons n elt) ; modify here
elt))
8
(defun showdots (lst)
(let ((n (length lst)))
(dolist (obj lst)
(format t "(~A . " obj))
(format t "NIL")
(do ((i 1 (+ i 1)))
((> i n) 'nil)
(format t ")"))))
9
前注:一开始感觉在 3.15 节那个 bfs 算法上改动一下,使当前 node 等于 end 并且 (cdr queue) 为 nil 时再返回,这样可以找到 longest path。然而为了避免在环路中无终止,需要再加上两个限制,都是针对 new-paths 函数的:1. 如果当前带入的 node 是 end 的话,就废弃这条路,不再返回;2. 如果非 1 中情况,先把 mapcar 映射得到的列表搞出来,把其中存在重复元素的子列表删去(即环路),再返回给 bfs 函数。
(defun shortest-path (start end net)
(bfs end (list (list start)) net))
(defun bfs (end queue net)
(if (null queue)
nil
(let ((path (car queue)))
(let ((node (car path)))
(if (and (eql node end) (null (cdr queue)))
(reverse path)
(bfs end
(append (cdr queue)
(new-paths path node end net))
net))))))
(defun new-paths (path node end net)
(if (equal node end) ; if node = end, abandon it
nil
(let ((tmplst (mapcar #'(lambda (n) (cons n path)) (cdr (assoc node net))))
(reslst nil))
(dolist (obj tmplst)
(if (> (no-repeat obj) (length obj)) ; only return the path which has no repeat dots
(setf reslst (cons obj reslst))
nil))
reslst)))
(defun no-repeat (lst) ; judge whether there are repeat dots in a path list. if yes, return number less than or equal to length(lst); or return length(lst)+1
(let ((tmplst nil))
(do ((i 1 (+ i 1)))
((or (member (nth (- i 1) lst) tmplst) (> i (length lst))) i)
(setf tmplst (cons (nth (- i 1) lst) tmplst)))))
用于测试的网络:1.
'((a b c) (b c) (c d) (d b))2.'((a b) (b e) (e f c) (c b d f) (f c))
后注:体会到了 lisp 调试的好。直接在 clisp 里边 load 一下,然后直接顶层调用相关函数,就可以调试了,速度很快。
ANSI Common Lisp Practice - My Answers - Chatper - 3的更多相关文章
- ANSI Common Lisp Practice - My Answers - Chatper - 2
I work out the questions by myself Chapter 2 question 4. (defun greater (x y) (if (> x y) x y ) ) ...
- 简体中文 — ANSI Common Lisp 中文版
简体中文 - ANSI Common Lisp 中文版 简体中文¶
- ANSI Common Lisp 中文翻譯版 — ANSI Common Lisp 中文版
ANSI Common Lisp 中文翻譯版 — ANSI Common Lisp 中文版 ANSI Common Lisp 中文翻譯版¶
- ANSI Common Lisp Learn
It has been a long time that I haven't dealt with my blog. On one hand I was preparing the exams.On ...
- MAC 下用 Common Lisp 调试 OpenGL 程序
MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...
- 在windows上安装common lisp开发环境
(2014.1写于CSDN的文章) 最近对lisp非常感兴趣,因此在google中搜索了“common lisp install windows”, 想装一个开发环境玩玩. 第一条结果就是 “Gett ...
- Common Lisp学习资源整理
Lisp Hackers: Interviews with 100x More Productive Programmers Posted on June 26th, 2013 Lisp Hacker ...
- 一道Common Lisp 宏的练习题
这是<ANSI Common Lisp>第10章“宏”的习题第6题: 定义一个宏,接受一变量列表以及一个代码主体,并确保变量在代码主体被求值后恢复 (revert)到原本的数值
- 搭建fedora开发环境 common lisp, c++, go
第三方软件库: http://download1.rpmfusion.org/free/fedora/releases/25/Everything/x86_64/os/repoview/index.h ...
随机推荐
- 如何在博客中使用SublimeText风格的代码高亮样式
因为觉得博客园自带的代码高亮样式很单一,不符合作为前端的我的审美习惯,于是下定决心要想办法折腾出一个方法来应用上另外一套代码高亮样式. 虽然探索的过程是很痛苦的,但最后还是成功了,但也不枉付出的那些努 ...
- 【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实 ...
- .NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序
在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...
- 数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型
Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之 ...
- Chrome调试中的奇技淫巧
网上有关Chrome调试的文章一搜一大堆,本文主要记录一下自己平时经常用并且又比较冷门的一些技巧. 打开Chrome调试工具 1.打开控制台的情况下,长按页面的“刷新”按钮可以选择按何种方式刷新(有正 ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- WCF Basics - FAQs Series【WCF基础----问答系列教程】
WCF学习系列一[WCF Interview Questions-Part 1 翻译系列] WCF学习系列二---[WCF Interview Questions – Part 2 翻译系列] WCF ...
- Mysql FROM_UNIXTIME效率 VS PHP date()效率 数据说话!
这几天在做数据统计,有几个统计图的需求是这样的: 按照年.月.日统计订单数量, 比方一年12个月,统计出1月多少订单,二月多少订单,按照这种模式统计. 但是数据库里存放的是 timestamp 的 ...
- GJM : Unity3D HIAR -【 快速入门 】 一、简介
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 9.2.2 .net framework下的MVC 控件的封装(下)
控件封装的部分说明 可能有人觉得应该前后端分离,我也承认这是应该的方向,我们也在考虑使用ng2等简化前端.但是,我们封装控件还是因为如下原因综合考虑的: 我们这是个框架,上面支撑了许多个应用,包含几百 ...