Clojure 如何通过递归生成列表?
在很多情况下,我想通过递归函数来制作列表,但我找不到正确的方法 例如,我想从列表中一个接一个地提取元素,并创建与第一个列表相同的新列表Clojure 如何通过递归生成列表?,clojure,lisp,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 ()))) 我不想用压扁。 例如
(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]))
将被展平销毁。将
列表
替换为cons
:
(defn f [x]
(cons (first x)
(if (not= (rest x) '())
(f (rest x))
'())))
操作
(列表xy)
返回两个元素的列表:(xy)
。操作(cons x y)
返回列表,其中头(即第一个元素)是x
,尾(列表的其余部分)是y
,其中y
应该是列表本身。用cons
替换list
:
(defn f [x]
(cons (first x)
(if (not= (rest x) '())
(f (rest x))
'())))
操作
(列表xy)
返回两个元素的列表:(xy)
。操作(cons x y)
返回列表,其中头(即第一个元素)是x
,尾(列表的其余部分)是y
,其中y
应该是列表本身。不应该有“y必须是列表”而不是“y应该是列表”吗?(cons 1 1)java.lang.IllegalArgumentException:不知道如何从以下文件创建ISeq:java.lang.Integer(无源文件:0)(cons 1[1])(1 1 1)@boucekv这取决于Lisp风格。在某些风格中,对可能由两个非空原子组成。如果传递的是空列表,则会出现问题。最好在获取第一个元素之前检查空列表:(if(=x'())()(cons(first x)(f(rest x)))
。不应该有“y必须是列表”而不是“y应该是列表”吗?(cons 1 1)java.lang.IllegalArgumentException:不知道如何从以下文件创建ISeq:java.lang.Integer(无源文件:0)(cons 1[1])(1 1 1)@boucekv这取决于Lisp风格。在某些风格中,对可能由两个非空原子组成。如果传递的是空列表,则会出现问题。最好在获取第一个元素之前检查空列表:(if(=x'())()(cons(first x)(f(rest x)))
。