我是朱莉娅的新手并且学习使用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)
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
答案 0 :(得分:4)
要了解如何使用'map / reduce / filter'替换'for loop + if block'代码,您需要确切知道它们的工作原理以及为什么选择它们。
<小时/>
map
函数 map
是一个函数,它将函数变量和列表作为参数,并返回 new 列表,其中每个元素都是应用的结果旧列表中每个元素的函数。例如,如果您的变量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
您可以将其重写为映射操作,如下所示:
A = map(x -> x + 5, [1,2,3,4,5]);
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
即。我们通过将二元函数连续应用于第一对元素,将列表简化为单个结果,逐渐消耗该列表。
所以如果您有以下代码:
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 = reduce(x,y -> x+y, [1,2,3,4,5])
filter
函数 filter
采用谓词函数(例如iseven
,isnull
,==
或任何接受参数并执行测试的内容它导致true或false)和列表,使用函数测试列表的每个元素,并返回一个新列表,该列表仅包含通过该测试的元素。 e.g。
filter(iseven, [1,2,3,4,5]) # returns [2,4]
如果我理解正确,addMultiplesOf3And5
取N(例如20),并执行以下操作:
您应该能够使用上述内容来确定具体代码:)
答案 1 :(得分:3)
不确定问题中的函数应该计算什么,但是:
addMult3or5(N) = N==3 ? 3 : sum(filter(x->((x%3==0)$(x%5==0)),3:N-1))
计算同样的事情。
sum
是reduce
类似+
操作的函数。
希望这有助于澄清。
此外,$
是朱莉娅的独家或操作。