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)))
可以使用 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)))