乘以列表中的每个元素与Scheme编程另一个列表中的每个元素(Multiplying each el

2019-09-28 01:31发布

我试图做如下方案:

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]);
    }
}

在上面的代码中看到的,我想乘第一个列表中的每个元素在第二列表中的每个元素。 所以1 * 2,1 * 4,1 * 6,1 * 8,然后转到下一个元素,2 * 2,2 * 4 ..等

我有实施方案将这种麻烦。 我尝试使用map功能,但是这似乎并没有工作,我希望它的方式。 有任何想法吗?

Answer 1:

首先,我们定义两个输入列表,我给他们改名,因为list是在计划一个内置的程序,是不是一个好主意来覆盖它):

(define l '(1 2 3 4))
(define l1 '(2 4 6 8))

我假设你想你的结果是“平的” -例如,它不包含元素的列表,只有要素(如果你确定与具有列表的列表l2 ,只是删除通话扁平化下面)。 为此,我们需要定义flatten的过程:

(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看看的-程序嵌套映射在书中部分SICP 。

(define l2
  (flatten
   (map (lambda (i)
          (map (lambda (j)
                 (* i j))
               l1))
        l)))

在这一点上, l2包含预期的答案:

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


Answer 2:

奥斯卡给了一个非常完整的回答了这个问题,但我想补充两个小笔记:

该计划方言球拍有一个很好的内置的形式呼吁for*/list这不正是这样的事情:

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

此外,而不是自己开发或使用该库的flatten中嵌套的地图解决方案的功能,你可以更换外mapappend-map从SRFI-1 。 还有很多其他的方法也一样,当然;-)



Answer 3:

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

(append-map (lambda (x)
              (map (lambda (y) (* x y))
                   (list 2 4 8 6)))
            (list 1 2 3 4))

append-map是一个简单的变型map是假定映射函数返回一个列表,所以它加到所有的结果列表。 这是最严重的计划系统(这是在库函数的SRFI-1库 ),但这里有一个简单的,不完整的定义(一个完整的定义,将处理多个参数列表):

(define (append-map f xs)
  (concat (map f xs)))

;;;
;;; Turns a list of lists into a list by appending all the top-level sublists.
;;; This is also a common library function.
;;;
(define (concat lists)
  (if (null? lists)
      '()
      (append (car lists)
              (concat (cdr lists)))))


文章来源: Multiplying each element of a list with each element of another list in Scheme programming