在这种情况下避免使用全局变量

时间:2017-04-27 02:16:16

标签: clojure tail-recursion

我写了这个"代码"显示问题,因为实际代码非常大

(defn add-list
  ([number]

  (def used [number])
  (add-list number used))

  ([number used]

   ;Add elements to used
   ;Process the elements in used
   ;Find the next number

   (add-list number used)
   ))

我需要有一个我可以在fn中访问的向量,它允许我处理向量中的项目,然后将输出添加到向量中,以便旧项目和新项目在此向量中下一个周期。

我通过在add-list函数上面定义向量来实现它,但如果我第二次在repl上运行该程序,则向量不会被清除。它还说有时向量是未绑定的。

1 个答案:

答案 0 :(得分:1)

reduce函数可用于累积结果列表,而不仅仅是总和值:

(defn accum-reverse
  [cum-state curr-val]
  (cons curr-val cum-state))

(println
  (reduce accum-reverse
    []              ; initial value of cum-state
    [1 2 3 4 5]     ; fed into curr-val one at a time
  ))

;=> (5 4 3 2 1)

函数accum-reverse被调用5次。第一次cum-state[]的初始值,即空向量。随后的每个时间cum-state都会设置为accum-reverse的上一个返回值。

除了在线文档,您还可以从Clojure for the Brave & True获得一些好的信息。其中大部分是在线的,但也值得购买。