我来用数学的方式解释一下,这是我正在努力用Scheme编写代码实现的转换:
(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)
当两个字母像ad
这样在一起时,意思是(* a d)
我正在尝试以纯函数的方式编写它,但我很难看出如何做到。任何建议都将不胜感激。
下面是一些示例:
(1mul '(0 1) '(0 1)) = '(0 0 1)
(1mul '(1 2 3) '(1 1)) = '(1 3 5 3)
(1mul '(1 2 3) '(1 2)) = '(1 4 7 6)
(1mul '(1 2 3) '(2 1)) = '(2 5 8 3)
(1mul '(1 2 3) '(2 2)) = '(2 6 10 6)
(1mul '(5 5 5) '(1 1)) = '(5 10 10 5)
(1mul '(0 0 1) '(2 5)) = '(0 0 2 5)
(1mul '(1 1 2 3) '(2 5)) = '(2 7 9 16 15)
所以,这个模式就像我一开始发布的那样:
将列表中的第一个数字乘以第二个列表中的每个数字(ad,ae,af),然后继续进行(bd,be,bf,cd,ce,cf),并“某种方式”排列数字以添加相应的值。我称其为重叠,因为你可以类比为这样:
(list
aa'
(+ ba' ab')
(+ ca' bb' ac')
(+ cb' bc')
cc')
再次提醒,
(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)
然而,这不仅适用于3x3列表,还适用于任何大小的列表。
+
和*
子句中,术语的顺序是否重要? - Theo Belaire