2017-03-27 3 views
2

Ich muss alle geraden Zahlen von String Eingang finden.Erhalten gerade Zahlen von String und Summe

Ich habe es geschafft, alle geraden Zahlen aufzulisten, aber ich verstehe nicht genau, wie ich danach die Summe dieser geraden Zahlen bekommen kann.

numbers :: String -> [Int] 
numbers [] = [] 
numbers (l:ls) = if ord l == 48 || ord l == 50 || ord l == 52 || ord l == 54 || ord l == 56 
    then (ord l - 48): (numbers ls) 
    else (numbers ls) 

So wäre das Ergebnis so etwas wie: "ABC1234" => 6

+1

Haskell zu schreiben, hat eine Funktion 'sum' . Wenn Sie die geraden Zahlen (und nicht die Zeichenfolgendarstellung dieser Zahlen) in einer Liste haben, summieren Sie einfach die Liste. Ich verstehe nicht, warum das ein Problem ist. Sicher haben Sie gesehen, wie man Listen summiert. In der Regel wird eines der allerersten Beispiele einer rekursiven Funktionsdefinition in Haskell eine sein, die Listen summiert (wenn Sie die eingebaute "Summe" nicht verwenden wollen). –

+0

Sie führen auch die Filterfunktion neu ein. – chepner

Antwort

2

Sie sind schon ganz schön dort. (ord l - 48) extrahiert den ganzzahligen Wert aus der Zeichenfolge, daher müssen Sie diesen Wert akkumulieren. Oder die Summe das resultierende Ergebnis nach oben (die im Grunde eine Funktion ist)

Die grundlegende rekursive Schleife wäre:

numbers :: String -> Int -> Int 
Given an empty string and accumulated value -> return accumulated value 
Given string (l:ls) not empty and accumulated value -> 
    if l matches your criteria 
      numbers ls (accumulated value + (ord l - 48)) 
    else 
      numbers ls (solely the accumulated value, as `l` doesn't match criteria) 
2

weitere Alternative die gleichen

import Data.Char(digitToInt) 

sumEvens = sum . map digitToInt . filter (`elem` "2468") 
Verwandte Themen