2017-12-31 16 views
2

Ich lade Sie ein, das folgende Problem von Fibonacci aus project Euler zu überprüfen. Die Frage fordert die Benutzer auf, zuerst eine Fibonacci-Sequenz oder -Funktion zu erzeugen, die die n-te Fibonacci-Zahl zurückgeben kann. Ich benutzen die zipWith Lösung eine faule/unendliche Liste der Fibonacci-Zahlen zu erzeugen:ProjectEuler Q2: Haskell Lösung wird nicht bewertet

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

Als nächstes stellt die Frage, um die Liste zu beschränken Zahlen/Werte weniger als fibonacci 4E6, und dann die geraden Zahlen summieren. Ich dachte wäre dies ein sehr einfache Liste Verständnis sein:

sum [x | x<-fibs, even x && x < (4*10^6 + 1)] 

Dieser Ausdruck wird die Bewertung nicht zu Ende .... Ich dachte, es würde gehen, bis sie die am weitesten rechts stehende Zahl (die erste fib größer als 4E6 finden , das 34. Element in der Liste fibs!!34) und dann die Liste beenden, eine kleine Anzahl von Ganzzahlen summieren. Was mache ich falsch?

+1

Sie können 'takeWhile' verwenden, um die Verarbeitung der Liste zu beenden, wenn sie kein Prädikat mehr erfüllt. – 4castle

+1

Die Liste ist monoton steigend, aber Haskell weiß das nicht - also wird es nicht aufhören, Elemente daraus zu bewerten, nur weil Sie über einen Schwellenwert gehen, der in ein Prädikat in einem Listenverständnis eingebunden ist. – hnefatl

Antwort

6

ghc weiß nicht, wann [x | x<-fibs, even x && x < (4*10^6 + 1)] sollte beendet werden und es wird versuchen, die unendliche Liste fibs auszuschöpfen. In anderen Worten, es wird versuchen, eine unbestimmte Liste von Fibonacci-Zahlen vor dem Terminieren auszuschöpfen. Sie sollten in takeWhile schauen.

+0

Die direkte Antwort ist '[y | y <- takeWhile (\ x -> x <4 * 10^6 + 1) fibs, sogar y] ' – W4t3randWind