如何通过递归列表?

时间:2013-02-18 08:49:31

标签: clojure lisp

在很多情况下我想通过递归函数制作列表,我找不到正确的方法如何做到这一点。

例如(我没有用,但我找到的最短)我想逐一从列表中获取元素并创建与第一个相同的新列表。

(defn f [x] (list 
          (first x) 
          (if (not= (rest x) '())
          (f (rest x))
          '()       
)))

(f '(1 2 3))

我想要

(1 2 3)

但我得到

(1 (2 (3 ())))

我想不要使用flatten。 例如,这个输入

(f '([1 1] [2 2] [3 3]))

将被压扁。

1 个答案:

答案 0 :(得分:4)

list替换为cons

(defn f [x] 
  (cons (first x) 
        (if (not= (rest x) '())
          (f (rest x))
          '())))

操作(list x y)返回两个元素的列表:(x y)。操作(cons x y)返回列表,其中头部(即第一个元素)为x,尾部(列表的其余部分)为y,其中y应列出其自身。