我是lisp
的新手,嘗試編寫一個遞歸函數,該函數返回列表中的最小數。它也想要檢測原子。下面的代碼返回錯誤:從列表中遞歸獲取最小數目
(defun minFromList (l)
(cond ((null l) nil) ; Causes error shown below
; (cond ((null l)) ; Causes the same error
; (cond ((null l) 0) ; It causes always 0 to be the final return val.
((numberp l) l)
((numberp (car l)) (min (car l) (minFromList(cdr l))))
((listp (car l)) (min (minFromList (car l)) (minFromList (cdr l))))
(t nil) ; if all condition doesn't hold just return nil.
)
)
錯誤:
*** - MIN: NIL is not a real number
顯然問題出在當給定列表爲空在那裏返回nil/0。什麼是可能的解決方法?謝謝。
環境)的Ubuntu 11.10,CLISP 2.49
更新)雖然我已經拿起this的答案,我歡迎,如果有其他的方法尤其是W/O如有作出新的功能。
下面是我選擇的答案所激發的最簡單的代碼。
(defun minNum (a b)
(cond ((null a) b)
((null b) a)
(t (min a b)))
)
我認爲你可以使用CLOS來實現這種風格。這是什麼語言? – 2012-02-18 00:20:32
@claytontstanley我發佈的內容不是可執行代碼,只是一個規範。 :)但是,是的,CLOS讓您以這種方式指定'min2',雖然它很可能是矯枉過正相比,在這種情況下'cond'。如果你想在CL模式匹配(統一,甚至),不過,總是有[CL-UNIFICATION(http://common-lisp.net/project/cl-unification/)庫,它工作得很好。 – 2012-02-18 11:40:47