今天第一次上机,做lisp实验,题目其实都还是蛮简单的,最担心的还是要怎么把简单的实验用长达10页的英文表达出来,现在还么有着手写report,等我写完了报告,再上来给大家做总结,今天小小的写了程序,在这里把自己学到的小小的总结一下,以后看到这篇文章的时候还可以温故而知新呢呵呵。
首先我们来看一个表达式:(cadadr '((a b e)(d e f))) 你知道运行的结果是什么吗?我们都知道car是返回表中的第一个元素,这个元素可以是个单个字母,也可以是一个list。cdr是返回list减去第一个元素,注意了返回的是list不是一个元素哦。我在看这个表达式子的时候都弄混了的。那再来看下一步一步的解:
首先执行cdr得到一个list如下:
> (cdr '(( a b c)( d e f)))
((D E F))
再对这个list(是包含一个元素,该元素是个list)执行car操作得到一个元素,但是这个也是list :
> (car '(( d e f)))
(D E F)
接下来再次执行cdr得到的list如下:
> (cdr '(d e f))
(E F)
最后car操作得到结果如下所示:
> (car '(e f))
E
其次我们要弄清楚cons和append的区别,他们的区别在于:cons是用来宽展list的,语法是:(cons 'a 'b),其中b应该是个list,当b不是list的时候我们得到的结果叫做dotted pairs.我们看下这两种结果:
> (cons 'a '(b))
(A B)
> (cons 'a 'b)
(A . B)
他们在书写上都是不一样的。append函数是用来联合两个list的,所以它的两个参数都是list。
> (append '(a b c) '(d e g))
(A B C D E G)
再次给一个用递归写求阶乘算法,很简单的,大家一看就明白
> (defun myf(n)(cond ((= n 0 )1)(t(* n (myf (- n 1))))))
MYF
> (myf 0)
1
> (myf 3)
6
> (myf 5) ;这个是在调用函数参数是5,运行结果是120.
120
最后给出一张今天晚上同学给我拍的相片哈哈,小小的自恋一下啦,明天继续看我的实验呢,算法和lisp的,我要加油啊,好好学习,天天向上呢。。。
刚才写了个把list倒置递归算法的代码如下:
> (defun reverse(list)
(cond ((= (length list) 0)"the list is empty")
((= (length list) 1) list )
(t((cons '(car list) ()) (reverse (cdr list))))
)
)
REVERSE
> (reverse '(a b c))
error: bad function - (CONS (QUOTE (CAR LIST)) NIL)
> 我不知道错在哪里呢,如果你知道告诉我一声哈呵呵,谢谢了