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

Common lisp LISP-用列表的第一个元素划分列表,common-lisp,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

我想写一个递归函数,它接受一个列表,然后将该列表与第一个元素分开。当我用

(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调试器时,它会崩溃,而且它也没有做它应该做的事情,也就是将第一个元素本身分割。如果有人知道我应该如何构造除法和递归,我很乐意接受。

如果没有正确的缩进和代码格式,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))))

(地图车(lambda(elem)(/elem(第一个列表)))(其余列表))
。被零除可以作为一个条件被捕获,或者在这个条件下进行测试。@Kaz,我想递归地进行,而不是用mapcar。当然<代码>(取消递归映射车(乐趣列表)(如果列表(cons(funcall乐趣(汽车列表)))(递归映射车乐趣(cdr列表‘‘)’)。然而,我不会在生产代码中这样做;我会使用内置的
mapcar
。不幸的是,您的代码大部分不可读,因为它的格式不可读。请格式化代码。谢谢@卡兹,不抱歉,这仍然不能回答我的问题。我只需要用一个列表来调用这个函数,而不是一个附加函数。这是可能的,但与任何语言一样,其他人甚至你自己都很难阅读和理解它。再次感谢您的评论。我对lisp还是一个新手,我很欣赏这个建议。@Streamline:许多编程语言都不鼓励使用深度嵌套的语句。使用Lisp可以将代码编写为嵌套列表。如果没有适当的缩进,这将很难理解。Lisp开发者总是缩进他们的代码,并且编辑器支持缩进。所以这很容易。Lisp本身也可以打印格式化的代码(请参阅函数PPRINT了解pretty print)。
(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)