Lisp Horner 的使用映射函数的方法

Lisp Horner's method using map-functions

可以使用 mapcan 或任何其他映射函数在 lisp 中实现 Horner's method 吗? 这是我没有映射函数的实现:

(defun Horner (lst x)
    (cond
        ((null (cdr lst)) (car lst))
        (t 
            (Horner 
                (cons 
                    (+ (* (car lst) x) (cadr lst)) 
                    (cddr lst)
                ) 
                x
            )
        )
    )
)

你不能用类似地图的函数来做,因为它们会产生 lists 和 您需要结果为 number.

然而,并非一切都失去了—— reduce 救援!

(defun horner (polynomial x)
  (reduce (lambda (a b)
            (+ (* a x) b))
          polynomial :initial-value 0))

请注意,此版本还可以正确处理 0 多项式:它 returns 调用为 (horner () 1) 时为 0(用任意数字替换 1)。 您的尾递归版本中的这个故障很容易修复:

(defun horner (polynomial x)
  (if (rest polynomial)
      (horner (cons (+ (* (first polynomial) x) (second polynomial))
                    (cddr polynomial))
              x)
      (or (first polynomial) 0)))