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)