0

リスト内の対応する場所に数値要素を挿入する関数を実装しようとしていますが、括弧に問題があります

(not(=(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)))))
4

1 に答える 1

3

まず、「括弧の問題」ではなく、リストの問題があります。

最初に使用してから平坦化する代わりに、を使用consする必要がありますconcat。次に、2つの基本ケースを組み合わせることができます。

効率の面では、ループ内の単一リンクリストの最後に単一の要素を追加しないでください。これにより、実行時間が2次になるためです。代わりに、前面に追加し、完了したら背面に追加します。

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

読者のための演習:事前条件と事後条件は何ですか、ループ不変条件は何ですか?

于 2012-08-31T20:59:56.730 に答える