反向并发故障

时间:2012-08-31 18:52:48

标签: clojure

我正在尝试实现一个在列表中相应位置插入数字元素的函数,但是我的括号有问题

  

(不是(=(1 3 5 6 7 9 16)(((1 3)5)6 7 9 16)))

我怀疑是因为反向以奇怪的方式执行,因为如果我执行

  

(my-flatten'(((1 3)5)6 7 9 16))

我得到了真正的答案:

  

(1 3 5 6 7 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)))))

1 个答案:

答案 0 :(得分:3)

首先,您没有“括号问题”,但列表存在问题。

您应该只使用cons,而不是使用第一个concat然后展平。您也可以将两个基本案例结合起来。

在效率方面,你不应该在循环中将单个元素附加到单链表的末尾,因为这会导致二次运行时。相反,完成时附加到正面和反面。

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

为读者练习:前后条件是什么,循环不变量是什么?