【发布时间】:2010-11-22 20:28:00
【问题描述】:
当我使用 (avg-bids 4000 10 5) 调用以下 Clojure 代码时,它会导致 java.lang.StackOverflowError。我试图弄清楚为什么,因为 sum-bids 是作为尾递归函数编写的,所以应该可以。使用 Clojure 1.2。
有人知道为什么会这样吗?
(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)))
【问题讨论】:
-
尾递归函数调用自己作为它做的最后一件事。我在您的代码中没有看到类似的内容。
-
@Gabe: loop-recur 导致类似尾递归的行为。见clojure.org/special_forms。
-
Ralph:
loop-recur是一个for循环模式。调用recur作为函数中的最后一件事将是尾递归,这不是他所做的。 -
recur抱怨它不在尾部位置。
标签: clojure