2014-09-05 118 views
2

您好我是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)))))) 

我知道,問題是,我利弊-ING與結束我的函數嵌套列表的最後一個元素的空單,但我無法弄清楚如何別的要做。

+0

你想重新實現扁平化還是隻刪除一級括號? Óscar的答案完全使整個序列變平。 – 2014-09-05 05:03:02

+1

我想扁平它。 – 2014-09-05 05:10:51

回答

0

迭戈的評論似乎表明有在這裏其他的答案,但我現在不看他們,所以這裏去...

你的函數結束得太早,因爲,當它擊中那本身就是一個項目列表,遞歸調用該項目上的up,並忽略原始列表中的其餘項目。 (up (first lst))

對您的代碼的最小更改是,遞歸調用up上的第一個列表項和列表的其餘部分的連接。 (up (concat (first lst) (rest lst)))

更好的是使用現有的核心功能flatten而不是up

在附註上,您通常希望使用recur來實現遞歸,而不是直接調用up,以避免大輸入列表的堆棧溢出。