List 在Scheme编程中,将列表的每个元素与另一个列表的每个元素相乘

List 在Scheme编程中,将列表的每个元素与另一个列表的每个元素相乘,list,recursion,scheme,racket,multiplication,List,Recursion,Scheme,Racket,Multiplication,我试图在计划中做到以下几点: List<int> list = new List<int>(); List<int> list1 = new List<int>(); List<int> list2 = new List<int>(); list.Add(1); list.Add(2); list.Add(3); list.Add(4); list1.Add(2); list1.Add(4); list1.Add(6); l

我试图在计划中做到以下几点:

List<int> list = new List<int>();
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list1.Add(2);
list1.Add(4);
list1.Add(6);
list1.Add(8);

for (int i = 0; i < list.Count; i++)
{
    for (int p = 0; p < list1.Count; p++)
    {
         list2.Add(list[i] * list1[p]);
    }
}
List List=新列表();
List list1=新列表();
List list2=新列表();
增加第(1)款;
增加(2);
增加(3);
增加(4);
清单1.添加(2);
清单1.添加(4);
清单1.添加(6);
清单1.添加(8);
for(int i=0;i
如上面代码所示,我试图将第一个列表中的每个元素与第二个列表中的每个元素相乘。所以1*2,1*4,1*6,1*8,然后进入下一个元素,2*2,2*4。。等等


我很难将此应用到计划中。我试着使用
map
功能,但这似乎不是我想要的方式。有什么想法吗?

我们从定义两个输入列表开始,我重命名了它们,因为
列表
是Scheme中的内置过程,覆盖它不是一个好主意):

我假设您希望结果列表是“平坦的”——例如,它不包含元素列表,只包含元素(如果您同意在
l2
中使用列表,只需删除下面对平坦的调用)。为此,我们需要定义
flant
过程:

(define (atom? x)
  (and (not (pair? x)) (not (null? x))))

(define (flatten lst)
  (cond ((null? lst) empty)
        ((atom? lst) (list lst))
        (else (append (flatten (car lst))
                      (flatten (cdr lst))))))
最后是手头的问题。一旦您了解了如何嵌套两个
map
过程,这就很简单了-请查看本书中的部分

此时,
l2
包含预期的答案:

(2 4 6 8 4 8 12 16 6 12 18 24 8 16 24 32)

我们首先定义两个输入列表,我重命名了它们,因为
list
是Scheme中的内置过程,覆盖它不是一个好主意):

我假设您希望结果列表是“平坦的”——例如,它不包含元素列表,只包含元素(如果您同意在
l2
中使用列表,只需删除下面对平坦的调用)。为此,我们需要定义
flant
过程:

(define (atom? x)
  (and (not (pair? x)) (not (null? x))))

(define (flatten lst)
  (cond ((null? lst) empty)
        ((atom? lst) (list lst))
        (else (append (flatten (car lst))
                      (flatten (cdr lst))))))
最后是手头的问题。一旦您了解了如何嵌套两个
map
过程,这就很简单了-请查看本书中的部分

此时,
l2
包含预期的答案:

(2 4 6 8 4 8 12 16 6 12 18 24 8 16 24 32)

Óscar对这个问题给出了一个非常完整的答案,但我想补充两个小注释:

Scheme方言有一个很好的内置表单,名为*/list的
,它正是这样做的:

(for*/list ([i '(1 2 3 4)]
            [j '(2 4 6 8)])
  (* i j))

此外,在嵌套贴图解决方案中,您可以使用
附加贴图
替换外部
贴图
,而不是使用自己或库的
展平
函数。当然,还有很多其他的方法;-)

斯卡尔对这个问题给出了一个非常完整的答案,但我想补充两点:

Scheme方言有一个很好的内置表单,名为*/list的
,它正是这样做的:

(for*/list ([i '(1 2 3 4)]
            [j '(2 4 6 8)])
  (* i j))

此外,在嵌套贴图解决方案中,您可以使用
附加贴图
替换外部
贴图
,而不是使用自己或库的
展平
函数。当然,还有很多其他的方法;-)

我不敢相信没有人给出最直接的答案:嵌套使用
map

(append-map (lambda (x)
              (map (lambda (y) (* x y))
                   (list 2 4 8 6)))
            (list 1 2 3 4))
append map
map
的一个简单变体,它假设映射函数返回一个列表,因此它连接所有结果列表。这是大多数严重方案系统中的一个库函数(在中),但这里有一个简单、不完整的定义(完整的定义将处理多个参数列表):


我不敢相信没有人给出最直接的答案:嵌套使用
map

(append-map (lambda (x)
              (map (lambda (y) (* x y))
                   (list 2 4 8 6)))
            (list 1 2 3 4))
append map
map
的一个简单变体,它假设映射函数返回一个列表,因此它连接所有结果列表。这是大多数严重方案系统中的一个库函数(在中),但这里有一个简单、不完整的定义(完整的定义将处理多个参数列表):


您是如何使用map进行尝试的,以及它是如何不按您的要求工作的?如果您唯一的问题是结果是嵌套列表,那么您可以在之后将其展平。您是如何尝试使用map的,它是如何不按您所希望的方式工作的?如果您唯一的问题是结果是嵌套列表,那么您可以在之后将其展平。