2013-02-18 104 views
2

在许多情况下,我想通过递归函数做出列表,我找不到正确的方式如何做到这一点。如何通过递归进行列表?

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

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

(f '(1 2 3)) 

我想

(1 2 3) 

,但我得到

(1 (2 (3()))) 

我想不使用压平。 例如,这种输入

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

将被夷为平地。

回答

4

更换listcons

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

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

+0

不应该有“y必须是列表”而不是“y应该是列表”? (0 1) (cons 1 1) java.lang.IllegalArgumentException:不知道如何创建ISeq:java.lang.Integer(NO_SOURCE_FILE:0) (cons 1 [1]) (11) – boucekv 2013-02-18 11:14:21

+0

@boucekv This取决于Lisp的风味。在一些口味中,对可以由两个非零原子组成。 – 2013-02-18 11:29:53

+3

如果传递一个空列表,这将会出现问题。在采用第一个元素之前检查一个空列表会更好:'(if(= x'())'()(cons(first x)(f(rest x))))'。 – 6502 2013-02-18 14:12:48