Function 在Lisp中乘以2个列表

Function 在Lisp中乘以2个列表,function,lisp,multiplication,Function,Lisp,Multiplication,我有一个函数,它把两个列表作为输入,我想让第一个列表中的所有内容与第二个列表中的所有内容相乘,然后计算总和 到目前为止,我的功能如下: (defun multiply(a b) (if (eq a nil) 0 (progn (* (car a) (car b)) (multiply (car a) (cdr b))) )) 目前我所要做的就是从第一个列表中取第一个数字,然后用第二个列表中的所有数字乘以1。但是,当在函数中重新调用函数时,我会出现此错误: (这是我输入的’(1

我有一个函数,它把两个列表作为输入,我想让第一个列表中的所有内容与第二个列表中的所有内容相乘,然后计算总和

到目前为止,我的功能如下:

(defun multiply(a b)
(if (eq a nil)
0
(progn
      (* (car a) (car b))
  (multiply (car a) (cdr b)))
))
目前我所要做的就是从第一个列表中取第一个数字,然后用第二个列表中的所有数字乘以1。但是,当在函数中重新调用函数时,我会出现此错误:

(这是我输入的’(1 2 3)和’(4 5 6))

值1不是列表类型

(乘以1’(5 6))


任何帮助都将不胜感激

如果要将每个元素的两个列表相乘,您应该能够使用mapcar:

(mapcar #'* '(3 4 5) '(4 5 6))
关于您现有函数中的错误,这一行应该是:

...
  (multiply (cdr a) (cdr b)))
...

如果要将每个元素的两个列表相乘,则应能够使用mapcar:

(mapcar #'* '(3 4 5) '(4 5 6))
关于您现有函数中的错误,这一行应该是:

...
  (multiply (cdr a) (cdr b)))
...

loop
是否可接受

案例1

如果结果应为90,如中所示

那你就可以做了

(defun multiply (a b)
  (loop for i in a
    sum (loop for j in b
          sum (* i j))))
案例2

如果结果应该是32,如中所示

那就是

(defun multiply (a b)
  (loop 
    for i in a
    for j in b
    sum (* i j)))

loop
是否可接受

案例1

如果结果应为90,如中所示

那你就可以做了

(defun multiply (a b)
  (loop for i in a
    sum (loop for j in b
          sum (* i j))))
案例2

如果结果应该是32,如中所示

那就是

(defun multiply (a b)
  (loop 
    for i in a
    for j in b
    sum (* i j)))

我会修改

(取消乘法运算(a b)
(如果(等式a为零)
0
(+
(*(a车)(b车))
(乘(cdr a)(cdr b(())))
当你打电话的时候

(multiply '(1 2 3) '(4 5 6))
它将返回总数

32

我会修改

(取消乘法运算(a b)
(如果(等式a为零)
0
(+
(*(a车)(b车))
(乘(cdr a)(cdr b(())))
当你打电话的时候

(multiply '(1 2 3) '(4 5 6))
它将返回总数

32

你所描述的听起来像:

上面的解决方案很好,因为它纯粹是功能性的,但是,唉,它创建了一个不必要的中间列表。当然,a应该能够消除这种情况,但实际上,最好使用
循环

(defun dot (l1 l2)
  (loop for x in l1 and y in l2 sum (* x y)))

还请注意,使用s表示不是一个很好的主意,请使用s来代替。

您描述的内容听起来像:

上面的解决方案很好,因为它纯粹是功能性的,但是,唉,它创建了一个不必要的中间列表。当然,a应该能够消除这种情况,但实际上,最好使用
循环

(defun dot (l1 l2)
  (loop for x in l1 and y in l2 sum (* x y)))

还请注意,使用s表示不是一个很好的主意,请改用s。

您能澄清一下示例中的预期结果是32还是90吗?对不起,应该是32。您能澄清一下示例中的预期结果是32还是90吗?对不起,应该是32。另外请注意,您仍然可以使用带有向量的
循环
,但是在中使用
,而不是在
中使用
。@Svante:这是留给读者的练习(同时修改第1个版本以使用向量。还请注意,您仍然可以对向量使用
循环
,但在
中使用
而不是
中的
。@Svante:这是留给读者的练习(同时修改第一个版本以使用向量。在emacs lisp中,需要
cl
首先:
(let()(require'cl)(reduce'+(cl-mapcar#'*'(3-4-5);(4-5-6))
。在emacs lisp中,需要
cl
首先:
(let()(require'cl)(reduce'+(cl-mapcar#'*'(3-4-5);(4-6)))
。请添加解释。请添加解释。