我必须像这样计算一个多项式——

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。

最佳答案

参数位置中的*评估为您在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)

10-04 14:24