2016-07-06 15 views
1

Angenommen habe ich einen Code, wo ich den Mittelwert der Zahlen berechnen wollen die Funktion höherer Ordnung mit reduce():Verständnis reduzieren()

var ofAvg = [1,2,3,4,5] 

var doAvg = ofAvg.reduce(0) { $0 + $1 } 

doAvg/ofAvg.count //This gives me the correct answer which in this case is 3. 

Aber wenn ich tun:

var ofAvg = [1,2,3,4,5] 

var doAvg = ofAvg.reduce(0) { ($0 + $1)/ofAvg.count } 

I Holen Sie sich den Ausgang als 1. Was falsch mache ich? Ist mein Verständnis von reduce() nicht das, was es eigentlich ist? Ist es möglich, den Durchschnitt zu erhalten, ohne doAvg/ofAvg.count außerhalb der reduce() Methode zu tun?

+1

Sie teilen durch die Zählung bei jeder Iteration. –

+1

Sie müssen nur einmal durch die Anzahl der Elemente dividieren. – itskoBits

Antwort

4

Sie brauchen nur einmal die Teilung zu tun, schließlich Summierung erfolgt:

var ofAvg = [1,2,3,4,5] 

var doAvg = ofAvg.reduce(0) { $0 + $1 }/ofAvg.count 

Sie haben nicht einmal separaten Verschluss in diesem Fall benötigen, da + bereits die gleiche Art hat, die Sie suchen für ((Int, Int) -> Int), so können Sie es einfach direkt verwenden:

var doAvg = ofAvg.reduce(0, combine: +)/ofAvg.count 

PS Bitte verwenden Sie bessere Namen. Variablen sollten Substantive (oder Nominalphrasen) sein, und Funktionen sollten Verben (oder Verbalphrasen) sein.

+0

Das hat es getan. Ich habe komplett vergessen 'reduce()' macht seine Operation für jedes Element des Arrays. Ich danke dir sehr. :) – Dershowitz123

+0

Es dauert mindestens 9 Minuten. Ich werde es sobald ich kann. Danke noch einmal! :) – Dershowitz123

+0

OK :) Bitte beachten Sie auch meine Änderungen – Alexander