2016-07-24 9 views
0

Wie kann ich meine List Artikel Wert mit Rekursion und die Summe aller meiner List Elemente Gesamtwert zurück?Scala: Anzahl Listenelement Wert über Rekursion

def getTotalValue(list: ListBuffer[Double], val: Double): Double = { 

    list.foreach(x => { 
     val += x 
    }) 
    } 
+1

Arbeiten Sie mit einer 'List' oder einem' ListBuffer'? Das sind zwei verschiedene Arten. –

Antwort

1

Dies sollte für jede Sequenz (List und ListBuffer) arbeiten

@tailrec 
def getTotalValue(list: Seq[Double], value: Double): Double = 
    list.headOption match { 
    case Some(v) => getTotalValue(list.tail, value + v) 
    case None => value 
    } 

Z.B. Um es zu nutzen:

getTotalValue(ListBuffer(1,2,3,4), 0) 
getTotalValue(List(1,2,3,4), 0) 

10,0

zurückkehren Wenn Sie etwas Bestimmtes Liste möchten, können Sie die Vorteile der Nachteile nehmen (: :) Betreiber passen :: Schwanz statt mit headOption Kopf.

(Obwohl, ich nehme an, Sie dies mehr tun für akademische Zwecke. Ein einfacher Weg, um die Werte zu summieren wäre zu verwenden Summe. Eg Liste (1,2,3,4) .sum)

1

Try diese

import scala.annotation.tailrec 

def getTotal(list: List[Int]) = { 
    @tailrec 
    def get(list: List[Int], total: Int): Int = list match { 
    case head :: tail => get(tail, total + head) 
    case Nil => total 
    } 
    get(list, 0) 
} 

getTotal(List(90,8,98,10,-3)) // should be return 203 
getTotal(List(15,10,20,10)) // should be return 55 
1

Um die Ebene Rekursion (nicht Endrekursion) zeigen

def f(xs: List[Double]): Double = if (xs.isEmpty) 0D else xs.head + f(xs.tail) 

überlegen, wo wir zurückkommen 0.0 whene Ver Die aktuelle Liste ist leer, oder wir fassen den Kopfwert der aktuellen Liste mit dem (rekursiven) Aufruf von f mit dem Rest der aktuellen Liste zusammen.

Durch monoton abnehmende Größe der Liste in jedem rekursiven Aufruf wird garantiert, dass der triviale Fall (die leere Liste) schließlich erreicht wird und damit jeder typsichere Aufruf dieser Funktion beendet wird. Darüber hinaus ist die Funktion gut definiert, sie deckt sowohl leere als auch nicht leere Listenfälle ab.