54/ (push x y)把x放入列表y的前端。而(pop x)则是将列表 x 的第一个元素移除,并返回这个元素。
1 > (setf x '(b))
(B)
1 > (push 'a x)
(A B)
1 > x
(A B)
1 > (pop x)
A
表达式
(push obj lst)等同 (setf lst (cons obj lst))
而表达式
(pop lst)等同于(let ((x (car lst)))
(setf lst (cdr lst))
x)
55/ reverse,返回列表的倒序新列表
2 > (reverse '(1 2 3 4))
(4 3 2 1)
2 > (defun our-reverse (lst);;;函数名及形参
(let ((acc nil));;设定变量并附初始值我空表
(dolist (elt lst);;;依次取列表中的值到elt
(push elt acc));;;把elt存储的值放入变量acc中
acc));;;返回最终acc列表。结果为倒序列表
OUR-REVERSE
2 > (our-reverse '(1 2 3 4))
(4 3 2 1)
2 > (reverse '(1 2 3 4))
(4 3 2 1)
56/ pushnew放入列表中未出现的成员
2 > (let ((x '(a b)))
(pushnew 'c x)
(pushnew 'a x)
x)
(C A B);;;c被放入列表,但是a没有,因为它已经是列表的一个成员了
57/ 正规列表与点状列表
* '(a . (b . nil))
'(a . (b))
'(a b . nil)
'(a b)
输出值都为
(A B)
58/ assoc,用来取出在关联列表中,与给定的键值有关联的Cons对:只能取得关联列表中第一个出现键值的成员
2 > (setf trans '((+ . "add") (- . "subtract")))
((+ . "add") (- . "subtract"))
2 > (assoc '+ trans)
(+ . "add")
2 > trans
((+ . "add") (- . "subtract"))
2 > (assoc '* trans)
NIL
2 > (assoc '- trans)
(- . "subtract")
1 > (setf trans '((- . "add") (- . "subtract") (+ . "subtract") (+ . "add")))
((- . "add") (- . "subtract") (+ . "subtract") (+ . "add"))
1 > trans
((- . "add") (- . "subtract") (+ . "subtract") (+ . "add"))
1 > (assoc '+ trans)
(+ . "subtract")
1 > (assoc '- trans)
(- . "add")
1 > (setf trans '((- . "add") (- . "subtract") (+ . "add") (+ . "subtract")))
((- . "add") (- . "subtract") (+ . "add") (+ . "subtract"))
1 > TRANS
((- . "add") (- . "subtract") (+ . "add") (+ . "subtract"))
1 > (assoc '+ trans)
(+ . "add")
59/ 最短路径
2 > (setf min '((a b c) (b c) (c d)));;;变量及赋初始值,最小网络?
((A B C) (B C) (C D))
2 > min
((A B C) (B C) (C D))
2 > (defun new-paths (path node net);;;;定义函数名及形参
(mapcar #'(lambda (n) (cons n path));;;接受一个函数和一个列表,并用接受的函数对列表进行操作。本次调用无函数名,直接调用的函数体即本身。
(cdr (assoc node net) )));;;取得从net中返回第一个包含node值的成员,并对该成员cdr,然后对cdr后的新列表执行直接调用的函数体lambda。。。
NEW-PATHS
1 > (setf trans '((- . "add") (- . "subtract") (+ . "add") (+ . "subtract")))
((- . "add") (- . "subtract") (+ . "add") (+ . "subtract"))
1 > trans
((- . "add") (- . "subtract") (+ . "add") (+ . "subtract"))
1 > (assoc '+ trans)
(+ . "add")
1 > (cdr (assoc '+ trans))
"add"
2 > (defun bfs (end queue net);;;函数名及形参
(if (null queue);;;;;判断queue是否为空,是真,否假
nil;;真,空,返回nil
(let ((path (car queue)));;;设置变量,并赋值queue列表的第一个元素
(let ((node (car path)));;;设置变量,并赋值path元素的car
(if (eql node end);;;判断node值与end值是否相同,是真,否假
(reverse path);;;返回path列表的倒序新列表
(bfs end
(append (cdr queue)
(new-paths path node net));;;该列表中的成员组成新列表
net))))));;;迭代循环
BFS
2 > (defun shortest-path (start end net);;;函数名及形参
(bfs end (list (list start)) net));;;;返回所有列表组合的形式
SHORTEST-PATH
2 > (cdr (assoc 'a min))
(B C)
2 > (shortest-path 'a 'd min);;;最短路径
(A C D)