我有一个整数的总分区,我只想要那些所有值都不相等的分区对于ex.-3的分区是{1,1,1},{2,2},{3,1},{1,1,2}和{4}因此,所需的不等分区是{3,1}和{4},因为它们不包含相等的元素。
下面提供了用于查找所有分区的代码我可以过滤这些分区以获得所需的结果,但是我需要一些有效的方法来找到所有分区,这些分区中没有相等的项,而不需要找到所有的分区。我已经搜索过网络和stackoverflow,但没有任何东西能确切说明我所面临的问题每一个想法都是值得赞赏的谢谢。
function total_partitions_of_a_number($n) {# base case of recursion: zero is the sum of the empty list
if(!$n) return array(array()); # return empty array
# modify partitions of n-1 to form partitions of n
foreach(total_partitions_of_a_number($n-1) as $p) { # recursive call
$a[] = array_merge(array(1), $p); # "yield" array [1, p...]
if($p && (count($p) < 2 || $p[1] > $p[0])) { # p not empty, and length < 2 or p[1] > p[0]
++$p[0]; # increment first item of p
$a[] = $p; # "yield" p
}
}
return $a; # return all "yielded" values at once
}
最佳答案
所以您只希望分区中任何给定的组件出现不超过一次递归很简单。
把它简化为求解N的分区的问题,这样集合中没有元素大于某个值a(a最初将是N),现在,a在分区中出现或不出现根据这一点,您将递归地求解(n-a)的分区,这样就没有元素大于a-1,而对于n的分区,就没有成员大于a-1。
在这两种情况下,递归都是适定的,并且在不再可能解决问题时终止,因此,当a*(a+1)/2