生成的Ruby独特有序分区(Generating unique sorted partitions

2019-07-29 18:07发布

我试图生成组序列如下图所示,在没有任何特别的顺序,但在这里它作为一个递减的序列中。 请注意,每个序列也下降,如我感兴趣的组合,而不是排列。 我想每个序列的序列集合存储为array..or作为数组的数组更优选地,但首要的事情。

6                   
5   1               
4   2               
4   1   1           
3   3               
3   2   1           
3   1   1   1       
2   2   2           
2   2   1   1       
2   1   1   1   1   
1   1   1   1   1   1

现在,我只是专注于生成这些组和我试图递归地做到这一点。 Essentially..these是数字的所有序列时联合收割机将给予一定的total..in这种情况下6.但是请注意如何当第一个数字是3,一套遵循数字仅仅是给出了一个总的序列集合3.换句话说6(目标总) - 3(第一个数字)= 3(组给予总的3序列的)。 因此,应该能够递归地做到这一点。

我试图代码如下所示(是的,这是我的第一语言,是的,我只是一直在一个星期左右学习,所以我敢肯定,它的所有搞砸了),但至今没有运气。 我想,如果我可以得到递归工作的核心,并把所有的对象的值到屏幕上,所以我可以通过线追踪其行,我想我可以继续前进,但逻辑和语法之间,我在一台“M依然。

我的逻辑是:

  • 定义通过“计数”代表总是否定位的方法。
  • 创建这是会保持值的给定序列的阵列
  • 创建表示所述阵列(忽略零位置)中的位置的索引。
  • 定义“增量”和它初始化为“计数”的值,并将它表示阵列的剩余部分的剩余目标之和。 (因为没有什么初始阵列中,Δ是相同的数量。)

然后,通过准备从1开始和结束,显然序列的下一个(第一个)值,最大可能的,这是“计数”的值本身周期。 确定在周期中的每个值按新的增量。

如果增量为0,你做决定,否则这个新的序列,这将给这个新的增量。 可能需要追加新的序列到当前的顺序为好。

i=0

    def seq(count)
        cvc=Array.new  # array to hold the number values
        i=i+1  # position index for the array
        puts 'i is ' + i.to_s
        delta=count 
        puts ' delta is ' + delta.to_s

        for value in 1..delta do  # value represents the number value
                cvc[i]=value
                puts 'cvc[i] is ' + cvc[i].to_s
                delta = delta-cvc.sum
                puts 'new delta is '+ delta.to_s
            if delta >1  then count=delta
                    seq(count)
            end
        end
    end

Answer 1:

这里有一个解决方案:

def expand(n, max = n)
  return [[]] if n == 0
  [max, n].min.downto(1).flat_map do |i|
    expand(n-i, i).map{|rest| [i, *rest]}
  end
end

expand(6) # => [[6], [5, 1], [4, 2], [4, 1, 1], [3, 3], [3, 2, 1], [3, 1, 1, 1], [2, 2, 2], [2, 2, 1, 1], [2, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 


文章来源: Generating unique sorted partitions in Ruby