嗨,我是一个新的clojure,我试图编写一个调用的函数,从列表的每个顶级元素中删除一对括号。如果顶级元素不是列表,则也会添加它。例如,
>(up '((1 2) (3 4)))
(1 2 3 4)
>(up '(x (y) z))
(x y z)
现在,如果我试图删除一对括号,我的功能问题很快就会结束。我希望以递归的方式执行此操作,如果可能的话,不需要其他功能的帮助。我现在所拥有的:
(defn up [lst]
(if (empty? lst)
()
(if (list? (first lst))
(up (first lst))
(cons (first lst) (up (rest lst))))))
我知道问题是我正在使用嵌套列表的最后一个元素来结束我的函数,但是我无法弄清楚如何做到这一点。
答案 0 :(得分:0)
迭戈的评论似乎表明这里还有其他答案,但我现在没有看到它们,所以这里有......
你的功能太快结束了,因为当它击中一个本身就是列表的项目时,它会递归调用该项目上的up
并忽略原始列表中的其余项目。 (up (first lst))
对代码的最小更改将是,在第一个列表项和列表的其余部分的串联上递归调用up
。 (up (concat (first lst) (rest lst)))
更好的方法是使用现有的核心功能flatten
而不是up
。
另外,您通常希望使用recur
实现递归,而不是直接调用up
,以避免大型输入列表的堆栈溢出。