Clojure - 递归函数

时间:2014-09-05 03:03:09

标签: clojure

嗨,我是一个新的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))))))

我知道问题是我正在使用嵌套列表的最后一个元素来结束我的函数,但是我无法弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:0)

迭戈的评论似乎表明这里还有其他答案,但我现在没有看到它们,所以这里有......

你的功能太快结束了,因为当它击中一个本身就是列表的项目时,它会递归调用该项目上的up并忽略原始列表中的其余项目。 (up (first lst))

对代码的最小更改将是,在第一个列表项和列表的其余部分的串联上递归调用up(up (concat (first lst) (rest lst)))

更好的方法是使用现有的核心功能flatten而不是up

另外,您通常希望使用recur实现递归,而不是直接调用up,以避免大型输入列表的堆栈溢出。