【问题标题】:Finding out if two Lists have some elements in common by only using map function仅使用 map 函数找出两个列表是否有一些共同的元素
【发布时间】:2021-10-19 13:41:54
【问题描述】:

我正在处理 Maple 中的一个问题。但是我的问题很笼统,可以根据任何编程语言来回答。

问题:

  • 仅使用地图功能(无循环)。假设有两个包含 n 和 m 个元素的列表 A 和 B。将 A 中的那些元素替换为 B 中也存在的“true”,并将 A 中的其他元素替换为“false”。

问题: 我确实尝试过这样解决这个问题:

funk := proc(i::integer,j::integer) # checks if two elements are identical
if (i = j) then
return true;
else
return false;
end if;
end proc:

funktion := proc(int::integer, L :: list) # calls funk on every element of L.
map(funk, L, int);
end proc:

SchnittTrueA := proc(M::list, L::list) # calls funktion on every Element of M and L.
map(funktion,M,L);
end proc:

如果我为 k :=[1,3] 和 l := [2,3] 运行 SchnittTrueA(k,l);,我会得到以下结果:

[[false, false], [false, true]]

这绝不是我想要程序做的事情!

我需要类似的东西[false, true]

我尽我所能,但我不知道如何解决这个问题。

P.S1:我是新手程序员,所以请不要对我太苛刻:D。 P.S2:如果你想给我任何提示/答案,只要你可以使用地图功能,它不需要是枫叶语言。

【问题讨论】:

    标签: function maple


    【解决方案1】:

    除了map 之外,还不清楚您还可以使用什么。例如。您的用户定义过程使用if..then 等。

    但以下不使用循环。

    前两个相当有效,因为对于列表A 中的每个元素t,只要在列表B 中找到任何匹配元素,它们就会生成true

    相比之下,最后两种方法效率低下,因为它们针对列表 A 中的每个元素 t 与列表 B 中的每个元素进行测试(即使已经找到匹配项)。

    restart;
    A := [$1..10];
    
             [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    B := [seq(ithprime(i),i=1..4)];
    
                      [2, 3, 5, 7]
    
    map(member,A,B);
    
      [false, true, true, false, true, false, true, false, false, false]
    
    map(t->ormap(evalb@`=`,B,t),A);
    
      [false, true, true, false, true, false, true, false, false, false]
    
    map(t->`or`(op(map(evalb@`=`,B,t))),A);
    
      [false, true, true, false, true, false, true, false, false, false]
    
    map(t1->`if`(map(t2->`if`(t2=t1,true,NULL),B)=[true],
             true,false),A);
    
      [false, true, true, false, true, false, true, false, false, false]
    

    在上面显示的四种方法中,第四种在精神上最接近您的尝试。

    我将展示一些与上面第四个等效的方法,每个都更接近您最初的尝试。

    restart;
    A := [$1..10]:
    
    B := [seq(ithprime(i),i=1..4)]:
    

    每个等价物都使用相同的 AB 示例列表。

    func := (t1,t2)->`if`(t2=t1,true,NULL):
    
    funktion := (t1,B)->`if`(map(func,B,t1)=[true],
                         true,false):
    
    map(funktion, A, B);
    
    [false, true, true, false, true, false, true, false, false, false]
    

    现在使用proc,而不是更短的运算符语法。

    func := proc(t1,t2)
              `if`(t2=t1,true,NULL);
            end proc:
    
    funktion := proc(t1,B)
                  `if`(map(func,B,t1)=[true],
                              true,false);
                end proc:
    
    map(funktion, A, B);
    
    [false, true, true, false, true, false, true, false, false, false]
    

    现在使用if..then 的长格式,而不是更短的if 运算符格式。

    func := proc(t1,t2)
              if t2=t1 then
                true;
              else
                NULL;
              end if;
            end proc:
    
    funktion := proc(t1,B)
                  if map(func,B,t1)=[true] then
                    true;
                  else
                    false;
                  end if;
                end proc:
    
    map(funktion, A, B);
    
     [false, true, true, false, true, false, true, false, false, false]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2018-04-03
      • 2021-03-13
      • 2011-08-22
      • 2016-06-02
      相关资源
      最近更新 更多