我需要在列表中表示数字的分区。该过程还接受确定分区的最大数量和初始分区的最大值的参数。
(list-partitions 5 2 4)
>((4 1) (3 2))
此处初始总数为5,最大分区数为2,最大初始分区为4。
从概念上讲,我认为我应该将分区数字提供给一个帮助函数,为我构建分区。但是我该如何实现呢?
解决了
答案 0 :(得分:2)
这是Racket的可能解决方案。首先,partition
过程(基于this算法)生成整数n
的完整分区列表。然后list-partitions
过程按要求过滤结果:
#lang racket
(define (partition n)
(let loop ((n n)
(acc '()))
(if (zero? n)
(list acc)
(append-map (lambda (i)
(loop (- n i) (cons i acc)))
(reverse (build-list n add1))))))
(define (list-partitions n max-number max-init)
(take (filter (lambda (lst)
(<= (apply max lst) max-init))
(partition n))
max-number))
(list-partitions 5 2 4)
> '((1 4) (2 3))