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