今天第一次上機,做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)
> 我不知道錯在哪裏呢,如果你知道告訴我一聲哈呵呵,謝謝了