2012-08-31 29 views
0

我試圖執行該插入在它的相應位置中的列表的數字元件的功能,但是我有括號中的問題反向併發misfunction

(未(=(1 3 5 6 7 9月16日)(((1 3)5)6 7 9 16)))

我懷疑是因爲反向是在陌生的方式執行的,因爲如果我執行

(我的 - (((1 3)5)6 7 9 16))

我得到真正的答案:

(1 3 5 6 7 8 9 16)

這裏是我的代碼:

(defn insert [x lst] 
    (loop [prev() lst lst] 
     (cond 
     (empty? lst) (my-flatten (cons (reverse prev) (list x))) 
     (> (first lst) x) (my-flatten (cons (cons (reverse prev) (list x)) lst)) 
     :else (recur (conj prev (first lst)) (rest lst))))) 
+0

你會考慮編輯你的原始問題,並在插入一個數字之前顯示你的列表的例子以及你希望它看起來像什麼之後?我從一開始就看到了一個樹狀結構(不是(= ...),但是對於你正在嘗試做什麼有點困惑,而且這些數字總是有序的,或者你的函數能夠呈現數字不符合要求?以不同的方式提出是(((1 3)5)6 7 9 16)'開始或結束,並且這個序列是否會有數字失序? – octopusgrabbus

回答

3

首先,你不必一個「帶括號的問題」,但列表存在問題。

而不是先使用cons然後展平,您應該只使用concat。您也可以結合這兩個基本情況。

在效率方面,不應將單個元素附加到循環中單鏈表的末尾,因爲這會導致二次運行。相反,完成後追加到前面,反向。

(if (or (empty? lst) (> (first lst) x)) 
    (concat (reverse prev) (list x) lst) 
    (recur (cons (first lst) prev) (rest lst))) 

對讀者的練習:什麼是前置和後置條件,什麼是循環不變量?