2017-04-26 134 views
0

我想寫一個遞歸函數,它接受一個列表,然後用第一個元素劃分該列表。當我打電話與LISP - 用列表中的第一個元素劃分列表

(divfirst '(3 6 9 12)) 

函數應該返回

(1 2 3 4) 

到目前爲止,我得到這個

(defun divfirst (list) 
    (COND ((= (FIRST list) 0) (PRINT 'div_durch_null)) ; Catch division by 0 
     (list (/ (FIRST(REST list)) (FIRST list)) (divfirst (cons (FIRST L) (REST L)))) ; Division and recursion 
) 
) 

然而,因爲它是現在它崩潰時,我嘗試了Lisp的調試器去調用它,它也沒有按照它自己劃分第一個元素的意思去做。如果有人得到一個提示,我應該如何構建分區和遞歸,我會很樂意接受它。

+0

'(mapcar(拉姆達(elem)(/ elem(first list)))(rest list))'。除以零分可以作爲條件被捕獲,或者在此附近進行測試。 – Kaz

+0

@Kaz,我想遞歸地做,而不是使用mapcar。 – Streamline

+1

當然可以! '(defun recursive-mapcar(fun list)(if list(cons(funcall fun(car list))(recursive-mapcar fun(cdr list)))))'。但是,我不會在生產代碼中這樣做;我會使用內置的'mapcar'。 – Kaz

回答

1

沒有正確的縮進和代碼格式化,Lisp編程是不可能的。

你的第一個程序正確格式化:

(defun divfirst (liste) 
    (if (zerop (first liste)) 
     'div_by_zero)     ; <- this if result is never used 
    (labels ((div (liste d) 
      (if (null liste) 
       nil 
       (cons (/ (first liste) d) 
        (div (rest liste) d))))) 
    (div liste (first liste)))) 

這將是一個工作版本:

(defun divfirst (list) 
    (cond ((= (first list) 0) 
     (print 'div_durch_null)) 
     (list (/ (first (rest list)) 
       (first list)) 
       (divfirst (cons (first l) 
           (rest l)))))) 

你在徵求意見第二個版本

(defun divfirst (list &optional head) 
    (if head 
     (if (null list) 
      nil 
     (cons (/ (first list) head) 
       (divfirst (rest list) head))) 
    (divfirst list (first list)))) 

CL-USER 64 > (divfirst '(3 6 9 12)) 
(1 2 3 4) 
+0

好吧,這是可能的,但和其他語言一樣,很難被他人閱讀和理解,有時甚至你自己。再次感謝您的評論。我仍然很new lis,我很欣賞這個建議。 – Streamline

+0

@Streamline:很多編程語言不鼓勵深度嵌套語句。使用Lisp,你可以將代碼編寫爲嵌套列表。如果沒有適當的縮進,這很難理解。 Lisp開發人員總是縮進他們的代碼,並且它受編輯支持。所以這很容易。 Lisp本身也可以打印格式化的代碼(請參閱功能PPRINT以獲得漂亮的打印效果)。 –

相關問題