Das folgende Stück Clojure-Code führt zu java.lang.StackOverflowError, wenn ich es mit (avg-Gebote 4000 10 5) aufrufen. Ich versuche herauszufinden, warum Sum-Gebote als eine tail-rekursive Funktion geschrieben werden, also sollte das funktionieren. Verwenden von Clojure 1.2.StackOverflowError auf Tail-rekursive Funktion
Weiß jemand, warum das passiert?
(ns fixedprice.core
(:use (incanter core stats charts)))
(def *bid-mean* 100)
(defn bid [x std-dev]
(sample-normal x :mean *bid-mean* :sd std-dev))
(defn sum-bids [n offers std-dev]
(loop [n n sum (repeat offers 0)]
(if (zero? n)
sum
(recur (dec n) (map + sum (reductions min (bid offers std-dev)))))))
(defn avg-bids [n offers std-dev]
(map #(/ % n) (sum-bids n offers std-dev)))
Eine Tail-rekursive Funktion nennt sich selbst als das letzte, was sie tut. So etwas sehe ich in deinem Code nicht. – Gabe
@Gabe: Schleife-Reverse verursacht ein Tail-Rekursion-ähnliches Verhalten. Siehe http://clojure.org/special_forms. – Ralph
Ralph: 'loop-recur' ist ein' for' Loop-Pattern. Wenn Sie "recur" als letztes in Ihrer Funktion aufrufen, wäre das eine Tail-Rekursion, was er nicht tut. – Gabe