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)))
。请添加解释。请添加解释。