2016-09-17 100 views
1

我是新来的朱莉娅和学习使用地图,减少,过滤器。 对于我来说,了解它如何取代while循环变得非常困难。 对于离下面的代码,我想换成for循环地图,减少,过滤适用于循环和while循环

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 
+1

或许给出到目前为止你已经尝试了一些什么细节。另请参见[StackOverflow作业指导](http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions) –

+0

过去一段时间,因为我使用了地图功能,但从我记得,它将一个函数应用于列表中的每个元素。所以当然for循环也可以做到这一点。所以应该清楚如何使用for循环来代替。 – barlop

回答

2

要了解如何用'map/reduce/filter'替换'for循环+ 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 

你可以重写这个作为像这样的映射操作:

A = map(x -> x + 5, [1,2,3,4,5]); 

2. 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)以及列表,使用该函数测试列表中的每个元素并返回一个新列表,该列表仅包含通过该测试的元素。例如

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

回答你的问题

如果我理解正确的话,addMultiplesOf3And5花费数N(如20),并执行以下操作:

  • 过滤了所有的元素可以由列表[1,2,3,...,20]中的3或5除以
  • 将结果列表的所有元素一起使用减少功能。

您应该能够使用上面找出确切的代码:)

2

不知道是什么的问题的功能应该算,但:

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

计算同样的事情。

sum是一个reduce类似于+操作的函数。

希望这有助于澄清。

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

+1

你可以用'reduce(+,x)'替换'sum(x)',如果这样可以让它更清楚地表达它的关系。 (顺便说一句,我猜这是一个FizzBu​​zz变量)) –