可以使用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
)
)
)
)
答案 0 :(得分:4)
您不能使用类似地图的功能,因为它们会生成列表和 您需要将结果设为数字。
然而,并非所有人都失去了 -
reduce
救援!
(defun horner (polynomial x)
(reduce (lambda (a b)
(+ (* a x) b))
polynomial :initial-value 0))
请注意,此版本还正确处理0多项式:它
调用(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)))