通用Lisp:未定义函数k

时间:2018-07-26 09:00:15

标签: common-lisp

我对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))

2 个答案:

答案 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)))))