Julia 映射、减少、过滤应用于for循环和while循环

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)

我对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)
      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)