(defn calc-next-step [input]
(if (= 1 (count input)) input
(loop [[x y] input
[op & rest-input] (nthnext input 2)
output ''()]
(if (number? op)
(recur [y op] rest-input (concat output (list x)))
(concat output `(~(op x y)) rest-input )))))
(defn rpn-seq [input]
(iterate (fn [n] (calc-next-step n)) input))
Der Output kann folgendermaßen aussehen. Ich habe aus Lesbarkeitsgründen die Ausgabe formatiert, und die Clojure-Operatoren durch Zeichen ersetzt, die man dann auch lesen kann ;-). Ansonsten würde der Multiplikator folgendermaßen aussehen:
#<core$_STAR_ clojure.core$_STAR_@3e2f1b1a>
Java toString halt ;-)
Hier die formatierte Ausgabe
(take 5 (rpn-seq (calc-next-step [12 2 3 + 2 * 5 / -]))) ((12 5 2 * 5 / -) (12 10 5 / -) (12 2 -) (10) (10))Mir ist gerade später aufgefallen, dass der innere Aufruf unnötig ist. Der kann natürlich weggelassen werden ;-). Dann sieht das alles so aus:
(take 5 (rpn-seq [12 2 3 + 2 * 5 / -])) ((12 2 3 + 2 * 5 / -) (12 5 2 * 5 / -) (12 10 5 / -) (12 2 -) (10))
Keine Kommentare:
Kommentar veröffentlichen