(defun fizzbuzz(lst emptyList)
(if (= (mod (car lst) 3) 0)
(fizzbuzz (cdr lst) (append emptyList (list(append (car lst) '(fizz)))))
)
(if (= (mod (car lst) 5) 0)
(fizzbuzz (cdr lst) (append emptyList (list(append (car lst) '(buzz)))))
)
(if (and (= (mod (car lst) 3) 0) (= (mod (car lst) 5) 0))
(fizzbuzz (cdr lst) (append emptyList (list(append (car lst)
'(fizzbuzz)))))
)
(fizzbuzz (cdr lst) (append emptyList (car lst)))
)
(fizzbuzz '(1 2 3 4 5) '(0))
请记住我是新人。我的教授希望我们使用lisp练习递归。该程序应该将不能被5或3整除的数字添加到列表中。 那些被3整除的东西会像这样被插入到列表中(3 fizz)。那些被5整除的人:(5嗡嗡声)。两者都可以分割的(15 fizzbuzz)。我如何从函数中返回新列表?另外,为什么我会收到帖子标题中列出的错误?
答案 0 :(得分:2)
由于最后一个表达式(fizzbuzz (cdr lst) (append emptyList (car lst)))
,您收到此错误。
第一轮(fizzbuzz '(1 2 3 4 5) '(0))
变为(fizzbuzz '(2 3 4 5) '(0 . 1))
,然后它会尝试(append '(0 . 1) 2)
。 append
可以处理点列表和原子作为最后一个参数,但是当不是最后一个参数时它不能附加点列表。它应该用1
做什么?
也知道你没有停止条件,并且单独的if
无条件地运行到另一个if
所以对于15
它将首先递归到第一个,然后扔掉那个结果。然后它将在第二个递归,只是扔掉那个值。然后无条件地它会在最后一次递归。我非常确定您只希望调用其中一个,并使用if-elseif-else
执行此操作,其中lisp版本为cond
:
(cond
(p1 c1) ; if p1 then c1
(p2 c2 c2b) ; elseif p2 then c2 and c2b (last expression becomes the result)
(p3 c3) ; elseif p3 then c3
(t a4)) ; else a4