Lisp:相同的数学函数在不同的时间评估不同的值?

时间:2014-09-23 20:05:56

标签: lisp common-lisp

我必须计算这样的多项式 -

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。

1 个答案:

答案 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)