2017-06-12 1 views
0

Der folgende Code ist eine Funktion sum2, die als Argument eine Liste von Zahlen und gibt die Summe der Elemente der sogar Indizes. Kann mir jemand erklären, wie dieser Code funktioniert? Was sind X und Xs und wie finden sie die geraden Zahlen und fügen sie hinzu?Haskell Funktionsliste (finden Sie gerade Indizes und fügen Sie sie hinzu) ~ Code Erklärung

sum2 :: [Integer] -> Integer 
sum2 [] = 0 
sum2 (x:xs) | mod x 2 == 0 = x + sum2 xs 
      | otherwise = sum2 xs 

sum2' :: [Integer] -> Integer 
sum2' [] = 0 
sum2' [x] = x 
sum2' (x:_:xs) = x + sum2' xs 

so, wenn Sie in der Konsole getroffen SUM2 [2,3,3,4,0,6] es nur die geraden Zahlen hinzufügen und das Ergebnis sein wird: 12

Antwort

1

sum2 wie es aussieht, Summiert alle Werte, die gerade sind. x ist der "aktuelle" Wert (Kopf der Liste), und xs ist der Rest. Wenn mod x 2 == 0 (gerade), fügen Sie x zur Summe des Rests der Liste hinzu, andernfalls überspringen Sie es und summieren Sie den Rest der Liste.

sum2' wählt Elemente basierend auf Position statt Wert.

  1. Der letzte Fall, wenn es zumindest zwei Elemente in der Liste enthalten sind, überspringen die zweiten und fügt die ersten zu der Summe der übrigen.
  2. Wenn es genau eine gibt, ist das die Summe.
  3. Wenn es Null, die Summe ist 0.

So wird jedes zweite Element fällt, Summieren der ersten, dritten, fünften, usw. (Index 0, 2, 4, etc.) .

+0

Ich habe Ihren ersten Punkt nicht verstanden, warum sollten wir den zweiten überspringen und den ersten hinzufügen? – csandreas1

+0

@ csandreas1 Es ist in der Regel zwei Elemente der Liste auf einmal zu knacken und eines von ihnen zu behalten. Wenn Sie die geradzahligen indizierten wollen, behalten Sie die erste, und wenn Sie ungerade indiziert werden wollen, nehmen Sie die zweite (und der Einzelelementfall ignoriert auch das Element). Das "_" bedeutet grundsätzlich, dieses Element zu ignorieren - da wir es nicht benennen, können wir es nicht verwenden. – ryachza

Verwandte Themen