我对Common Lisp很陌生。我尝试建立自己的操作员功能。 在第一个函数中,我尝试将一个添加到给定的数字。 第二个函数应以m的频率递归使用第一个。 当我输入totaladd(5 3)时,我期望是8。 未定义的函数k我该怎么办? 还有
(defun add1(n)
(+ n 1)
)
(write (add1 5))
(defun totaladd (k m)
(if (eq m 0)
0
(totaladd(add1(k) (- m 1)))
)
)
(write (totaladd 5 3))
答案 0 :(得分:5)
下一行有三个错误:
(totaladd(add1(k) (- m 1)))
我们来看一下:
(totaladd ; totaladd is a function with two parameters
; you pass only one argument -> first ERROR
(add1 ; add1 is a function with one parameter
; you pass two arguments -> second ERROR
(k) ; K is a variable, but you call it as a function,
; but the function K is undefined -> third ERROR
(- m 1)))
答案 1 :(得分:2)
(defun add1 (n) (+ n 1))
(defun totaladd (k m)
(if (= m 0)
k
(add1 (totaladd k (- m 1)))))
(= ... 0)
有一个名为zerop
的附加函数,该函数询问数字是否为零。在递归数字时经常使用它作为递归的中断条件。
(- ... 1)
或(+ ... 1)
还有一个额外的功能,因为当使用数字分别递归(1- ...)
和(1+ ...)
时,这是常见的步骤。
(它们的破坏性形式为(incf ...)
和(decf ...)
,但递归不需要这些形式。)
因此,使用此表单,您的表单将变为:
(defun totaladd (k m)
(if (zerop m)
k
(add1 (totaladd k (1- m)))))