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)))