我必须计算这样的多项式 -
f(x)= x ^ 4 - 2.274x ^ 3 + 1.8x ^ 2 - 0.576x + 1.0
使用此lisp函数 -
(defun polynomial (x)
(+ (+ (+ (+ (expt x 4) (* -2.274 * (expt x 3)))
(* 1.8 (* x x))) (* -0.576 x)) 0.1))
当我调用(多项式0.5)时,结果在不同的评估中是不同的,如下所示 -
CL-USER> (polynomial 0.5)
-1.9495
CL-USER> (polynomial 0.5)
0.8786454
CL-USER> (polynomial 0.5)
0.07474504
CL-USER> (polynomial 0.5)
0.3032537
CL-USER> (polynomial 0.5)
0.23830011
CL-USER>
发生了什么事?我正在使用最新的sbcl。
答案 0 :(得分:17)
*
计算您在REPL中的最后一个结果。在您的代码中,您可能会在第一次运行后(* -2.274 * (expt x 3))
*
-1.9495
。 (如果最后一个结果不是数字,那么第一次运行时会出现错误。)
您可以为*
和+
提供多个参数,并且所有LISP都有波兰语前缀表示法,因此您的函数可能看起来更像这样:
;; f(x) = x^4 - 2.274x^3 + 1.8x^2 - 0.576x + 1.0
(defun polynomial (x)
(+ (expt x 4)
(* -2.274 (expt x 3))
(* 1.8 x x)
(* -0.576 x)
1.0)) ;; this was originally 0.1
(polynomial 0.5) ; ==> 0.94025004
基本上,中缀x + y + z
在前缀中变为(+ x y z)
。