Я пытаюсь сгенерировать целочисленные разделы для числа и наткнулся на это , которое выглядело довольно кратким и элегантным:
def partitions(n):
# base case of recursion: zero is the sum of the empty list
if n == 0:
yield []
return
# modify partitions of n-1 to form partitions of n
for p in partitions(n-1):
yield [1] + p
if p and (len(p) < 2 or p[1] > p[0]):
yield [p[0] + 1] + p[1:]
Итак, я попытался преобразовать это в Clojure ис треском провалился:
(defn- partitions [n]
(if (zero? n) []
(for [p (partitions (dec n))]
(let [res [(concat [1] p)]]
(if (and (not (empty? p))
(or (< (count p) 2) (> (second p) (first p))))
(conj res (into [(inc (first p))] (subvec p 1)))
res)))))
^^ Выше неверно.Например:
eul=> (partitions 4)
()
Должен ли я думать о ленивых последовательностях?
У меня проблемы с рассуждениями о коде Python, и мои попытки его преобразования пока не увенчались успехом.Любая помощь в выяснении, как это сделать, приветствуется.