我必须像这样计算一个多项式——
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)
。