リストのリストと値があります。私の目標は、述語に一致する最初のリスト (例: > リストの最初の項目) に値が変換される (新しい最初の項目) リストの新しいリストです。述語に一致するリストがない場合、値がリストの最後にある新しいリストを「開始」するようにします。
if my list is: ['(2 3 4) '(4 5 6 7) '(5 6 7)]
and my value: 3
and my predicate: (comp (partial < my-value) first)
then my result should be: ['(2 3 4) '(3 4 5 6 7) '(5 6 7)]
if my value was: 10
my result should be: ['(2 3 4) '(4 5 6 7) '(5 6 7) '(10)]
この問題は私を混乱させます。なぜなら、私の命令的な心は、それがどれほど簡単であるべきかを教え続けているからです。これはこれまでの私の試みです:
(defn add-to-first-list-that-matches [func value]
(loop [result []
remaining-lists list-of-lists
value-to-add value]
(if (empty? remaining-lists)
result
(let [current-list (first remaining-lists)
value-matches? (func value-to-add current-list)
new-list (if value-matches? (conj value-to-add current-list) current-list)]
(recur (conj new-list result)
(rest remaining-lists)
(if-not value-matches? value-to-add nil))))))
(クラッシュします) Clojure 式の魔法について教えてください :)
ところで。これを最長増加部分列問題の一部として解きたいと思います。