Julia 映射、减少、过滤应用于for循环和while循环
我对Julia是个新手,学习Map、reduce和filter的用法。 我越来越难以理解它是如何取代for和while循环的。 对于以下代码的ex,我想替换For循环Julia 映射、减少、过滤应用于for循环和while循环,julia,Julia,我对Julia是个新手,学习Map、reduce和filter的用法。 我越来越难以理解它是如何取代for和while循环的。 对于以下代码的ex,我想替换For循环 function addMultiplesOf3And5(N::Int) sumOfMultiples = 0 if(N == 3) return sumOfMultiples + N end for i = 3:N-1 if(i % 3 == 0 && i % 5 == 0)
function addMultiplesOf3And5(N::Int)
sumOfMultiples = 0
if(N == 3)
return sumOfMultiples + N
end
for i = 3:N-1
if(i % 3 == 0 && i % 5 == 0)
continue
elseif(i % 3 == 0)
sumOfMultiples += i
elseif(i % 5 == 0)
sumOfMultiples += i
end
end
return sumOfMultiples
end
我真的很感激你的帮助
更新:
这就是我在完成教程后所做的
function addMultiplesOf3And5(N::Int)
array = range(1,N-1)
return reduce(+, map(x -> multiples_of_3_Or_5(x), array))
end
function multiples_of_3_Or_5(n)
if(n % 3 == 0 && n % 5 == 0)
return 0
elseif(n % 3 == 0)
return n
elseif(n % 5 == 0)
return n
else
return 0
end
end
最终:
function addMultiplesOf3And5(N::Int)
array = range(1,N-1)
return reduce(+, filter(x -> ((x%3==0)$(x%5==0)), array))
end
不确定问题中的函数应该计算什么,但是:
addMult3or5(N) = N==3 ? 3 : sum(filter(x->((x%3==0)$(x%5==0)),3:N-1))
计算同样的事情
sum
是一个类似于+
操作的reduce
函数
希望这有助于澄清
另外,
$
是Julia中的异或运算。不确定问题中的函数应该计算什么,但是:
addMult3or5(N) = N==3 ? 3 : sum(filter(x->((x%3==0)$(x%5==0)),3:N-1))
计算同样的事情
sum
是一个类似于+
操作的reduce
函数
希望这有助于澄清
另外,
$
是Julia中的异或操作。要了解如何用“map/reduce/filter”替换“for loop+if block”代码,您需要确切了解它们是如何工作的,以及为什么会选择它们。
1.
map
功能
map
是一个函数,它将函数变量和列表作为参数,并返回一个新列表,其中每个元素都是将函数应用于旧列表中每个元素的结果。例如,如果变量f
引用了前面定义的函数f(x)=x+5
,并且有一个列表L=[1,2,3,4,5]
,那么map(f,L)
将返回[f(L[1])、f(L[2])、f(L[3])、f(L[4])、f(L[5])
因此,如果您有如下代码:
f(x) = x + 5;
L = [1,2,3,4,5];
A = zeros(5);
for i in L
A[i] = f(i);
end
f(x,y) = x + y
L = [1,2,3,4,5];
A = L[1];
for i in 2:length(L)
A = f(A, L[i])
end
您可以将其重写为映射操作,如下所示:
A = map(x -> x + 5, [1,2,3,4,5]);
A = reduce(x,y -> x+y, [1,2,3,4,5])
2.reduce
功能
reduce
采用二进制函数变量(即采用两个参数的函数)和列表作为参数。用一个例子也许能最好地解释它的作用。使用+
运算符调用reduce,并列出[1,2,3,4,5]
将执行以下操作:
Step 1: [1, 2, 3, 4, 5] % : 5 elements
Step 2: [1+2, 3, 4, 5] % [3,3,4,5] : 4 elements
Step 3: [3+3, 4, 5] % [6, 4, 5] : 3 elements
Step 4: [6+4, 5] % [10, 5] : 2 elements
Step 5: [10+5] % [15] : 1 elements
result: 15
i、 我们通过对第一对元素连续应用二进制函数,逐步消耗列表,将列表缩减为单个结果
因此,如果您有如下代码:
f(x) = x + 5;
L = [1,2,3,4,5];
A = zeros(5);
for i in L
A[i] = f(i);
end
f(x,y) = x + y
L = [1,2,3,4,5];
A = L[1];
for i in 2:length(L)
A = f(A, L[i])
end
您可以将其重写为reduce操作,如下所示:
A = map(x -> x + 5, [1,2,3,4,5]);
A = reduce(x,y -> x+y, [1,2,3,4,5])
3.过滤器
功能
filter
接受一个谓词函数(例如iseven
、isnull
、==
,或任何接受参数并对其执行测试(结果为真或假)和一个列表,使用该函数测试列表中的每个元素,并返回一个仅包含通过该测试的元素的新列表。e、 g
filter(iseven, [1,2,3,4,5]) # returns [2,4]
你问题的答案是什么
如果我理解正确,addmultiplesof3和5
接受数字N(例如20),并执行以下操作:
Step 1: [1, 2, 3, 4, 5] % : 5 elements
Step 2: [1+2, 3, 4, 5] % [3,3,4,5] : 4 elements
Step 3: [3+3, 4, 5] % [6, 4, 5] : 3 elements
Step 4: [6+4, 5] % [10, 5] : 2 elements
Step 5: [10+5] % [15] : 1 elements
result: 15
- 从列表[1,2,3,…,20]中筛选出可以被3或5除的所有元素
- 使用reduce函数将结果列表的所有元素依次添加到一起
您应该能够使用上面的内容来找出确切的代码:)要了解如何将“for loop+if block”代码替换为“map/reduce/filter”,您需要确切了解它们是如何工作的,以及为什么可以选择它们。
1.
map
功能
map
是一个函数,它将函数变量和列表作为参数,并返回一个新列表,其中每个元素都是将函数应用于旧列表中每个元素的结果。例如,如果变量f
引用了前面定义的函数f(x)=x+5
,并且有一个列表L=[1,2,3,4,5]
,那么map(f,L)
将返回[f(L[1])、f(L[2])、f(L[3])、f(L[4])、f(L[5])
因此,如果您有如下代码:
f(x) = x + 5;
L = [1,2,3,4,5];
A = zeros(5);
for i in L
A[i] = f(i);
end
f(x,y) = x + y
L = [1,2,3,4,5];
A = L[1];
for i in 2:length(L)
A = f(A, L[i])
end
您可以将其重写为映射操作,如下所示:
A = map(x -> x + 5, [1,2,3,4,5]);
A = reduce(x,y -> x+y, [1,2,3,4,5])
2.reduce
功能
reduce
采用二进制函数变量(即采用两个参数的函数)和列表作为参数。用一个例子也许能最好地解释它的作用。使用+
运算符调用reduce,并列出[1,2,3,4,5]
将执行以下操作:
Step 1: [1, 2, 3, 4, 5] % : 5 elements
Step 2: [1+2, 3, 4, 5] % [3,3,4,5] : 4 elements
Step 3: [3+3, 4, 5] % [6, 4, 5] : 3 elements
Step 4: [6+4, 5] % [10, 5] : 2 elements
Step 5: [10+5] % [15] : 1 elements
result: 15
i、 我们通过对第一对元素连续应用二进制函数,逐步消耗列表,将列表缩减为单个结果
因此,如果您有如下代码:
f(x) = x + 5;
L = [1,2,3,4,5];
A = zeros(5);
for i in L
A[i] = f(i);
end
f(x,y) = x + y
L = [1,2,3,4,5];
A = L[1];
for i in 2:length(L)
A = f(A, L[i])
end
您可以将其重写为reduce操作,如下所示:
A = map(x -> x + 5, [1,2,3,4,5]);
A = reduce(x,y -> x+y, [1,2,3,4,5])
3.过滤器
功能
filter
接受一个谓词函数(例如iseven
、isnull
、==
,或任何接受参数并对其执行测试(结果为真或假)和一个列表,使用该函数测试列表中的每个元素,并返回一个仅包含通过该测试的元素的新列表。e、 g
filter(iseven, [1,2,3,4,5]) # returns [2,4]
你问题的答案是什么
如果我理解正确,addmultiplesof3和5
接受数字N(例如20),并执行以下操作:
Step 1: [1, 2, 3, 4, 5] % : 5 elements
Step 2: [1+2, 3, 4, 5] % [3,3,4,5] : 4 elements
Step 3: [3+3, 4, 5] % [6, 4, 5] : 3 elements
Step 4: [6+4, 5] % [10, 5] : 2 elements
Step 5: [10+5] % [15] : 1 elements
result: 15
- 从列表[1,2,3,…,20]中筛选出可以被3或5除的所有元素
- 使用reduce函数将结果列表的所有元素依次添加到一起
您应该能够使用上面的代码来找出确切的代码:)也许可以提供一些您迄今为止尝试的详细信息。我使用map函数已经有一段时间了,但据我回忆,它将函数应用于列表的每个元素。。当然for循环也可以做到这一点。因此,应该清楚地知道如何使用for循环,也许可以给出一些您迄今为止尝试过的细节。我使用map函数已经有一段时间了,但据我回忆,它将函数应用于列表的每个元素。。当然for循环也可以做到这一点。因此,应该清楚如何使用for循环。您可以用
红色替换sum(x)