仅使用 map 函数找出两个列表是否具有某些共同元素
Finding out if two Lists have some elements in common by only using map function
我正在处理 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:
如果我 运行 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)]:
这些等效项中的每一个都使用相同的 A
和 B
示例列表。
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]
我正在处理 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:
如果我 运行 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)]:
这些等效项中的每一个都使用相同的 A
和 B
示例列表。
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]