仅使用 map 函数找出两个列表是否具有某些共同元素

Finding out if two Lists have some elements in common by only using map function

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

问题:

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

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:

如果我 运行 SchnittTrueA(k,l); 对于 k :=[1,3] 和 l := [2,3] 我得到这个结果:

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

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

我需要这样的东西[false, true]

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

P.S1:我是一个新手程序员所以请不要对我太苛刻 :D。 P.S2: 如果你想给我任何Tip / Answer,不需要是Maple Language,只要你会使用地图功能即可。

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

但以下不使用循环。

前两个相当有效,因为对于列表 A 中的每个元素 t 它们会在列表 [=] 中找到任何匹配元素后立即生成 true 20=].

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

restart;
A := [..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 := [..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]