我正在尝试编写一个递归代码来执行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).
答案 0 :(得分: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)
答案 1 :(得分:5)
要稍微扩展上一个(正确的)答案,此版本使用一些惯用函数:
(defun power (x y)
(if (plusp y)
(* x (power x (1- y)))
1))
答案 2 :(得分:2)
你不能使用括号进行分组,因为CL认为你想调用函数x和函数1.删除多余的这样:
(defun power(x y)
(if (> y 0)
(* x (power x (- y 1)))
1))
括号在外面,就像你的函数一样:
(power 2 3) ;==> 8
答案 3 :(得分:1)
当你在Lisp表达式中编写(X ...)时,你断言X是一个要在参数上调用的函数....
你的问题是你的表达中有太多的括号。当你写(电源(x .. 你已经做出了这个断言。写(电源x ......而不是。
答案 4 :(得分:0)
您正在调用此代码:
(power (x (- y 1)))
因此power
作为参数调用(x (- y 1))
。您确定要将x
作为函数调用吗?