2016-09-17 143 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變量)) –