我想编写一个递归函数,它接受一个列表,然后将该列表与第一个元素分开。当我用
调用该函数时(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 :(得分: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)