0

我正在尝试编写一个递归代码来做,x^y但是无论我如何更新代码,它都会给我一个错误。

编码:

    (defun power(x y) (if(> y 0) (* x (power(x (- y 1)))) (1)))

错误:

CL-USER 11 : 5 >Power 2 3
Error: Undefined operator X in form (X (- Y 1)).

错误:

CL-USER 11 : 5 >power(2 3)
Illegal argument in functor position: 2 in (2 3).
4

5 回答 5

13

您以错误的方式调用该函数。在 lisps 中,函数调用具有以下形式:

(f a b c) 

不是

f(a b c)

你有(power (x (- y 1)))你的递归定义,这反过来又产生(x (- y 1))了错误:x 不是一个函数。

使用(power x (- y 1))这样你的定义就变成了:

(defun power (x y)
   (if (> y 0)
      (* x
           (power x (- y 1))) 
      1))

并将其称为(power 2 3)

于 2013-09-03T10:35:45.887 回答
6

为了稍微扩展上一个(正确的)答案,这个版本使用了一些惯用的函数:

(defun power (x y)
  (if (plusp y)
    (* x (power x (1- y)))
    1))
于 2013-09-03T10:38:33.587 回答
2

您不能使用括号进行分组,因为 CL 认为您要调用函数 x 和函数 1。像这样删除多余的部分:

 (defun power(x y) 
     (if (> y 0) 
         (* x (power x (- y 1)))
         1))

括号在外面,就像在你的函数中一样:

 (power 2 3) ;==> 8
于 2013-09-03T10:37:57.540 回答
1

当您在 Lisp 表达式中编写 (X ...) 时,您是在断言 X 是要在参数上调用的函数 ....

您的问题是您的表达式中有太多括号。当你写 (power (x .. 你已经做出了这个断言。写 (power x ... 代替。

于 2013-09-03T10:37:28.893 回答
0

您正在调用以下代码:

(power (x (- y 1)))

所以作为参数调用power(x (- y 1))您确定要x作为函数调用吗?

于 2013-09-03T10:36:34.383 回答