Functional programming Scheme-在两个列表上迭代

Functional programming Scheme-在两个列表上迭代,functional-programming,scheme,Functional Programming,Scheme,大家好,我是学习计划方面的新手,经常遇到在命令式语言和函数式语言之间进行类比的问题 例如,如果我有两个数组 A = [1 2 3] B = [4 5 6] 如果我想用a的元素乘以B中的每个元素来创建一个新数组,我可以简单地执行以下操作(伪代码): 用函数式语言处理这个问题的方法有哪些?在Scheme中,最常见的数据结构是链表。除非您必须通过索引访问元素,否则最好使用列表,因为有无数用于处理列表的内置过程,这使得大多数算法在不使用索引的情况下易于实现。请记住,为了通过索引进行高效访问,使用向量将

大家好,我是学习计划方面的新手,经常遇到在命令式语言和函数式语言之间进行类比的问题

例如,如果我有两个数组

A = [1 2 3]
B = [4 5 6]
如果我想用a的元素乘以B中的每个元素来创建一个新数组,我可以简单地执行以下操作(伪代码):


用函数式语言处理这个问题的方法有哪些?

在Scheme中,最常见的数据结构是链表。除非您必须通过索引访问元素,否则最好使用列表,因为有无数用于处理列表的内置过程,这使得大多数算法在不使用索引的情况下易于实现。请记住,为了通过索引进行高效访问,使用向量将是一个更好的主意

话虽如此,根据您使用的Scheme方言,解决方案可以像这样简单(在Racket中,请参阅):

或者,仅使用标准方案:

(apply append
       (map (lambda (x)
              (map (lambda (y) (* x y))
                   b))
            a))

在Scheme和Racket中,数组(数组:由自然数索引的数据结构)使用向量表示

(define as  (vector 1 2 3))
(define bs  (vector 4 5 6))
要创建一个循环中的循环,我们将为*使用一个变量
。
普通
for*
的工作原理如下:

(for* ([a as] [b bs])
   (displayln (* a b))))
这里
a
通过向量
as
中的元素运行,
b
通过
bs
中的元素运行。由于使用了*
,因此b循环在a循环内运行。
如果使用
for
,则循环将并行运行(请尝试)

现在,由于我们想要收集元素,我们可以使用
for*/vector
将生成的元素存储在向量中:

(for*/vector ([a as] [b bs])
  (* a b)))
出于效率原因,可以这样写:

(for*/vector ([a (in-vector as)] [b (in-vector bs)])
  (* a b)))
这将生成效率略高的代码

然而

(for*/vector ([a as] [b bs])
  (* a b)))

如果
作为
bs
是列表,也会起作用。

对于长度相等的两个列表的邮政编码,
(地图*(列表1 2 3 4)(列表5 6 7 8))
在Scheme中是
(5 12 21 32)
。在Haskell中,
zipWith(*)[1,2,3,4][5,6,7,8]
==
[5,12,21,32]
。感谢标准方案+其他方言!极大地帮助了理解
(for*/vector ([a as] [b bs])
  (* a b)))
(for*/vector ([a (in-vector as)] [b (in-vector bs)])
  (* a b)))
(for*/vector ([a as] [b bs])
  (* a b)))