reduzieren-while-Funktion in clojure?

7

Ich bin neu in der Clojure-Programmierung und würde gerne wissen, was die idiomatische Methode ist, um folgendes zu tun:

  1. Ich möchte eine Sammlung von Zahlen nums zusammenfassen, die eine große Anzahl von Zahlen enthalten kann, nehmen wir an, es gibt nur positive Zahlen.

  2. Mir ist die genaue Summe egal, wenn die Summe sehr groß ist. Zum Beispiel, wenn die Summe der Zahlen größer als 9999 ist, würde ich einfach 10000 zurückgeben, ohne die verbleibenden Zahlen zu summieren.

Wenn ich es mit einer OO-Sprache wie Java implementiere, mache ich es vielleicht so:

%Vor%

Eine naive Implementierung in Clojure könnte wie folgt aussehen:

%Vor%

Dies scheint jedoch einige CPU-Ressourcen zu verschwenden, um die gesamte Sammlung von Zahlen zu summieren, was nicht erwünscht ist. Ich bin auf der Suche nach etwas wie Take-While-Funktion, aber für reduzieren, aber ich kann es nicht finden. Gibt es etwas wie:

%Vor%

Oder gibt es einen anderen Clojure idiomatischen Weg, um dieses Problem zu lösen? Ich denke, die Lösung kann auf eine Reihe von Problemen angewendet werden, die eine ähnliche Logik erfordern.

Jeder Kommentar wird geschätzt. Danke.

    
nybon 05.12.2013, 08:17
quelle

2 Antworten

15

Wenn Sie Clojure 1.5.x verwenden, können Sie die Vorteile von nutzen neue Funktion reduced :

%Vor%     
Leonid Beschastny 05.12.2013, 08:24
quelle
10

Eine der weniger bekannten Clojure-Funktionen scheint reductions zu sein. Es gibt Ihnen alle Zwischenergebnisse Ihrer Berechnung:

%Vor%

Das letzte Element von reductions 'result seq wird der reduzierte Wert sein. Es gibt mehrere Möglichkeiten, Ihr Prädikat zu erzwingen, z. mit some :

%Vor%

Die von @ leonid-bestastny angegebene reduce / reduced -Version ist wahrscheinlich schneller (kein Lazy-Sequence-Overhead, Reduzierer, ...), aber dieser wird auch in früheren Clojure-Versionen funktionieren.

    
xsc 05.12.2013 08:59
quelle

Tags und Links