Map,reduce,filter适用于for循环和while循环

时间:2016-09-17 20:43:29

标签: 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

2 个答案:

答案 0 :(得分:4)

要了解如何使用'map / reduce / filter'替换'for loop + if block'代码,您需要确切知道它们的工作原理以及为什么选择它们。

<小时/>

1。 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]);

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

即。我们通过将二元函数连续应用于第一对元素,将列表简化为单个结果,逐渐消耗该列表。

所以如果您有以下代码:

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])

3。 filter函数

filter采用谓词函数(例如isevenisnull==或任何接受参数并执行测试的内容它导致true或false)和列表,使用函数测试列表的每个元素,并返回一个新列表,该列表仅包含通过该测试的元素。 e.g。

filter(iseven, [1,2,3,4,5])   # returns [2,4]

您的问题的答案

如果我理解正确,addMultiplesOf3And5取N(例如20),并执行以下操作:

  • 过滤所有可以从列表中分为3或5的元素[1,2,3,...,20]
  • 使用 reduce 函数连续添加结果列表的所有元素。

您应该能够使用上述内容来确定具体代码:)

答案 1 :(得分:3)

不确定问题中的函数应该计算什么,但是:

addMult3or5(N) = N==3 ? 3 : sum(filter(x->((x%3==0)$(x%5==0)),3:N-1))

计算同样的事情。

sumreduce类似+操作的函数。

希望这有助于澄清。

此外,$是朱莉娅的独家或操作。