Lisp Horner使用map函数的方法

时间:2018-04-19 12:46:27

标签: lisp polynomial-math polynomials map-function

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

1 个答案:

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