#!/usr/bin/rep !# ;; 注意: 這裡的例子其實都有內建的函數可以取代 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 自己寫的 remove ;; 使用範例: (z-remove 2 '(5 2 8 1 2 4 3)) (defun z-remove (a x) (if x ; 如果 x 不是 nil 的話... (if (equal a (car x)) ; x 的頭需要刪除掉嗎? (z-remove a (cdr x)) (cons (car x) (z-remove a (cdr x))) ) nil ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 自己寫的排序程式 (注意 librep 內建的 sort 函數會破壞 ;; 原來的 list, 建議初學 functional programming 的讀者不要使用) ;; 使用範例: (z-sort '(5 2 8 1 2 4 3)) (defun z-sort (x) (if x ; 如果 x 不是 nil 的話... (insert (car x) (z-sort (cdr x))) ; 對 x 的後面排序, 再把最前面的元素安插到正確位置. nil ; 否則根本不用排了. ) ) ;; 使用範例: (insert 2 '(1 2 3 4 8)) (defun insert (a sorted) ; 假設 sorted 為已排序的 list (if sorted ; 如果 sorted 不是 nil 的話... (if (< a (car sorted)) ; x 比 sorted 的頭都還要小嗎? (cons a sorted) ; 那就直接放最前面; (cons (car sorted) (insert a (cdr sorted))) ; 不然 sorted 的頭要放最前面; x 要安插到 sorted 身體某處. ) (list a) ; sorted 是空的, 所以答案就是含有單一元素的 list. ) ) ;; Q: 這是什麼排序法? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 自己寫的 append (只能處理兩個 lists) ; 比較聰明的版本 (化簡 x) (defun z-append1 (x y) (if x (cons (car x) (z-append1 (cdr x) y)) y ) ) ; 一念之差 (化簡 y), 不小心選到比較難的寫法; ; 多用一個輔助函數 (化簡 x), 照樣可以寫出來 (defun z-append2 (x y) (cond ((> (length y) 1) (z-append2 (z-append2-elem x (car y)) (cdr y))) ((= (length y) 1) (z-append2-elem x (car y))) (t x) ) ) (defun z-append2-elem (x a) (if x (cons (car x) (z-append2-elem (cdr x) a)) (list a) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 求二次方程式的根 (defun poly2-root (a b c) (let ( ; 令: (ma2 (* -2 a)) ; ma2 為 -2*a (delta (sqrt (- (* b b) (* 4 a c)))); delta 為判別式的平方根 ) ; 則方程式的兩個根可簡寫為: (list (/ (+ b delta) ma2) (/ (- b delta) ma2)) ) )