【问题标题】:Write a recursive LISP function that finds the dot product of two lists of numbers of same length编写一个递归 LISP 函数,找出两个相同长度的数字列表的点积
【发布时间】:2016-10-03 06:44:43
【问题描述】:

刚开始学习LISP,我正在尝试弄清楚如何编写以下递归函数。

我应该有

(DOT-PRODUCT '(1 2) '(3 4)))

输出应该是 11

我写了以下

(defun DOT-PRODUCT (a b)
  (if (or (null a) (null b))
      0
      (+ (* (first a) (first b))
         (DOT-PRODUCT (rest a) (rest b)))))

似乎一切正常;但是,它仍然适用于不同长度的列表。我希望它只适用于具有相同长度的数字列表。我应该在哪里添加返回“无效长度”的代码?

【问题讨论】:

    标签: recursion lisp common-lisp


    【解决方案1】:

    一个简单的方法是重写函数,以便它使用条件形式cond检查不同的情况:

    (defun dot-product (a b)
      (cond ((null a) (if (null b) 0 (error "invalid length")))
            ((null b) (error "invalid length"))
            (t (+ (* (first a) (first b))
                  (dot-product (rest a) (rest b))))))
    

    cond的第一个分支中,如果第一个参数是NIL,那么第二个参数也必须是NIL,否则会产生错误。在第二个分支中,我们已经知道a不是NIL,所以立即产生错误。最后计算结果。

    【讨论】:

    • 感谢您对使用 cond 而不是 if 的详细解释和建议。这真的很有帮助!
    【解决方案2】:

    将列表 X 和 Y 的对应元素相乘:

    (mapcar #'* X Y)
    

    添加列表 Z 的元素:

    (reduce #'+ Z)
    

    放在一起:点积:

    (reduce #'+ (mapcar #'* X Y))
    

    reducemapcar 是“MapReduce”概念的基础,它是对包括点积、卷积积分以及无数种按摩和汇总数据的方法的概括。

    【讨论】:

      【解决方案3】:

      将列表 X 和 Y 的对应元素相乘:

      (mapcar #'* X Y)
      

      添加列表 Z 的元素:

      (reduce #'+ Z)
      

      放在一起:点积:

      (reduce #'+ (mapcar #'* X Y))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 2017-02-03
        • 2012-10-28
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        相关资源
        最近更新 更多