2016-04-12 8 views
0

Ich versuche, eine Funktion in Scala, die ein Integer-Argument dauert und gibt die Addition der Fibonacci-Zahlen bis zum angegebenen fib zurück. Nummer. Ich benutze einen Stream, um die fib zu bekommen. Zahlen, dann nach rechts falten, um sie hinzuzufügen. Warum erzeugt dies einen Stapelüberlauf und wie kann ich ihn beheben?Scala: falten auf Stream von Fibonacci Zahlen

def fibonacci(n: Int): Long = { 
lazy val f: Stream[Int] = 0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}.filter(_<=n) 
f.foldRight(0)(_+_).toLong 
} 

beispielsweise 5 eintritt, würde ich erwarten, 0 + 1 + 1 + 2 + 3 + 5 =

+0

Offensichtlich haben Sie sich eine Rekursion, die nie beendet wurde. – noru

+0

Der prägnanteste Fibonacci-Stream, dem ich begegnet bin: 'def fib: Stream [Int] = 0 # :: fib.scan (1) (_ + _)' – jwvh

Antwort

4

Die stackoverflow von .filter(_<=n), verursacht wird filter Notwendigkeit, alle fibonaci iterieren Zahlenliste generiert von 0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}.

Vielleicht möchten Sie:

0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}.takeWhile(_ <= n) 

Takewhile wird abgestimmt Prädikat Zahlen zurückkehren direkt und abbrechen, die anderen Zahlen iterieren.

+0

takeWhile hat funktioniert. Vielen Dank! – riv94

+0

Ein Problem jedoch ... warum kehren Fibonacci (5), Fibonacci (6), Fibonacci (7), Fibonacci (8) alle 12 zurück? – riv94

+0

'5, 6, 7' haben alle die gleichen Fibonacci-Nummern:' 0, 1, 1, 2, 3, 5', aber für '8' sollte sein:' 0, 1, 1, 2, 3, 5, 8', kannst du dein 'fibonacci (8)' nochmal überprüfen? – chengpohi

Verwandte Themen