Horner's method是否可以使用mapcan或任何其他map函数在lisp中实现?
以下是我在没有map函数的情况下的实现:

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

最佳答案

不能用类似于map的函数来实现,因为它们会生成列表和
你需要结果是一个数字。
然而,并不是所有的都失去了--
去救援!

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

注意,这个版本还正确地处理了0多项式:
调用reduce时返回0(用任意数字替换1)。
尾部递归版本中的此故障很容易修复:
(defun horner (polynomial x)
  (if (rest polynomial)
      (horner (cons (+ (* (first polynomial) x) (second polynomial))
                    (cddr polynomial))
              x)
      (or (first polynomial) 0)))

10-08 14:31