我正在尝试实现一个在列表中相应位置插入数字元素的函数,但是我的括号有问题
(不是(=(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)))))
答案 0 :(得分:3)
首先,您没有“括号问题”,但列表存在问题。
您应该只使用cons
,而不是使用第一个concat
然后展平。您也可以将两个基本案例结合起来。
在效率方面,你不应该在循环中将单个元素附加到单链表的末尾,因为这会导致二次运行时。相反,完成时附加到正面和反面。
(if (or (empty? lst) (> (first lst) x))
(concat (reverse prev) (list x) lst)
(recur (cons (first lst) prev) (rest lst)))
为读者练习:前后条件是什么,循环不变量是什么?