如何在 Lisp 或 Scheme 中获得两个列表的乘积?
How to get the multiplication of two lists in Lisp or Scheme?
我想我以后必须深入研究 SICP,但如果它是两个列表:
a b c d
1 2 3
有没有一种标准的方法可以在 2、3 或 4 行中进行乘法运算?
所以想要的结果是
a1 a2 a3 b1 b2 b3 ... d1 d2 d3
如果我们使用任何命令式语言/方法来做,它很简单,但是如果我们以功能方式(通过声明方法)使用 Lisp / Scheme,是否有标准方法来完成?
DrRacket 有 cartesian-product
:
(require racket/list)
(cartesian-product '(a b c d) '(1 2 3))
你可以这样重写你的 Javascript 代码(在 Racket 中):
> (apply append (map (lambda (a) (map (lambda (b) (list a b))
'(1 2 3)))
'(a b c d)))
'((a 1) (a 2) (a 3) (b 1) (b 2) (b 3) (c 1) (c 2) (c 3) (d 1) (d 2) (d 3))
或者在 Common Lisp 中:
CL-USER 1 > (apply #'append (mapcar (lambda (a) (mapcar (lambda (b) (list a b))
'(1 2 3)))
'(a b c d)))
((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3) (D 1) (D 2) (D 3))
我想我以后必须深入研究 SICP,但如果它是两个列表:
a b c d
1 2 3
有没有一种标准的方法可以在 2、3 或 4 行中进行乘法运算?
所以想要的结果是
a1 a2 a3 b1 b2 b3 ... d1 d2 d3
如果我们使用任何命令式语言/方法来做,它很简单,但是如果我们以功能方式(通过声明方法)使用 Lisp / Scheme,是否有标准方法来完成?
DrRacket 有 cartesian-product
:
(require racket/list)
(cartesian-product '(a b c d) '(1 2 3))
你可以这样重写你的 Javascript 代码(在 Racket 中):
> (apply append (map (lambda (a) (map (lambda (b) (list a b))
'(1 2 3)))
'(a b c d)))
'((a 1) (a 2) (a 3) (b 1) (b 2) (b 3) (c 1) (c 2) (c 3) (d 1) (d 2) (d 3))
或者在 Common Lisp 中:
CL-USER 1 > (apply #'append (mapcar (lambda (a) (mapcar (lambda (b) (list a b))
'(1 2 3)))
'(a b c d)))
((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3) (D 1) (D 2) (D 3))