LISP - 用该列表的第一个元素划分列表

时间:2017-04-26 17:24:39

标签: common-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调试器,并且它也没有做它应该分开第一个元素的东西。如果有人提示我应该如何构建除法和递归,我很乐意接受它。

1 个答案:

答案 0 :(得分:1)

如果没有适当的缩进和代码格式化,则无法进行Lisp编程。

您的第一个程序格式正确:

(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 (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 &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)