如何从构建结果列表的递归函数中获取尾部?

时间:2017-11-24 15:59:25

标签: clojure

目前,当我传递数字2时,以下代码将从2-10返回一个列表。我不希望它返回列表中的第一个元素2

boot.user=> (defn hierarchy [num]
#_=>   (when num
#_=>     (lazy-seq (cons num (hierarchy (#(when (< % 10) (inc %)) num))))))
#'boot.user/hierarchy

boot.user=> (hierarchy 2)
(2 3 4 5 6 7 8 9 10)

预期结果是

(3 4 5 6 7 8 9 10)

我知道如果我调用rest函数我会得到尾巴但是我无法想到这个函数的更好的重构让我只回尾。

1 个答案:

答案 0 :(得分:2)

首先,为了便于阅读,我会以这种方式重写你的功能:

(defn hierarchy [num]
  (when (< num 10)
    (lazy-seq (cons num (hierarchy (inc num))))))

user> (hierarchy 3)
;;=> (3 4 5 6 7 8 9 10)

然后你可以将递归抽象为内部函数,而外部将执行第一次递增:

(defn hierarchy [num]
  (letfn [(h-inner [num] (when (< num 10)
                           (lazy-seq (cons num (h-inner (inc num))))))]
    (h-inner (inc num))))

user> (hierarchy 3)
;;=> (4 5 6 7 8 9 10)

此任务最好用rangeiterate解决,但我想这是练习递归的教育示例。