2017-04-26 137 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以获得漂亮的打印效果)。 –

相关问题