Integer Überlauf mit Lazy-Sequenzen in Clojure

8

Ich lerne gerade, faule Sequenzen in Clojure zu verwenden, und ich bin mir nicht sicher, was ich im folgenden Code falsch mache:

%Vor%

Die Zahlen, die summiert werden, sollten nicht größer als 100 sein, was verursacht den Integer-Überlauf?

    
Chetan 25.06.2012, 20:34
quelle

2 Antworten

5

Das Filtern einer unendlichen Folge erzeugt eine unendliche Folge und das Reduzieren über diesen Ursachen-Filter, um nach einem anderen übereinstimmenden Gegenstand zu suchen, selbst nachdem das Prädikat nicht mehr wahr ist.

Ersetzen Sie filter durch take-while . Die unendliche Sequenz, die von (fib) generiert wird, führt dazu, dass filter für immer ausgeführt wird. Vorher bricht sie jedoch aufgrund des aufgetretenen ArithmeticException ab. take-while stoppt die weitere Auswertung der Liste, nachdem das (fn [x] (< x n)) Prädikat zu false ausgewertet wurde.

%Vor%     
Jan 25.06.2012, 21:03
quelle
5

beginnend mit clojure 1.3.0 Nummern werden nicht automatisch auf bigInt / bigDecimal hochgestuft.

um dies zu beheben, benutze stattdessen +'

Ihre 100. Fibinachi-Zahl ist zu groß für eine ganze Zahl

%Vor%     
Arthur Ulfeldt 25.06.2012 20:59
quelle