在Ruby中生成唯一的排序分区

在Ruby中生成唯一的排序分区,ruby,recursion,data-partitioning,Ruby,Recursion,Data Partitioning,我试图生成如下所示的序列集,不是以任何特定的顺序,而是在这里显示为降序序列。注意,每个序列也会下降,因为我对组合感兴趣,而不是排列。我想将每个序列存储为一个数组..或者将序列集存储为一个数组数组更好,但首先要做的是 6 5 1 4 2 4 1 1 3 3 3 2 1 3 1 1 1

我试图生成如下所示的序列集,不是以任何特定的顺序,而是在这里显示为降序序列。注意,每个序列也会下降,因为我对组合感兴趣,而不是排列。我想将每个序列存储为一个数组..或者将序列集存储为一个数组数组更好,但首先要做的是

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
现在我只专注于生成这些集合,并尝试递归地进行。基本上,这些都是当联合收割机给出一些总数时的数字序列。在这种情况下,6。但是请注意,当第一个数字是3时,后面的一组数字就是一组序列,它们的总数是3。换句话说,6(目标总数)-3(第一个数字)=3(总数为3的序列集)。因此,您应该能够递归地执行此操作

我试着编写如下代码(是的,这是我的第一门语言,是的,我只学习了大约一个星期,所以我确信这一切都搞砸了),但到目前为止运气不好。我想如果我能让递归的核心工作起来,把所有对象的值放到屏幕上,这样我就可以逐行跟踪它,我想我可以前进,但是在逻辑和语法之间,我处于停滞状态

我的逻辑是:

  • 定义一个传递表示目标总数的“count”的方法
  • 创建一个数组,该数组将保存给定的值序列
  • 创建表示数组中位置的索引(忽略零位置)
  • 定义“delta”并将其初始化为“count”值,并使其表示数组其余部分的剩余目标和。(由于数组中最初没有任何内容,因此增量与计数相同。)
然后,在序列的下一个(第一个)值的可能范围内循环,从1开始,然后以最大可能值结束,这就是“count”本身的值。确定循环中每个值的新增量

如果增量为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
这里有一个解决方案:

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]] 

如果您选择代码,然后点击编辑器工具栏中的
{}
按钮,它会在每行前面加上四个空格,并提供代码格式。顺便说一句,
i
在运行此函数时将没有值,因此
i=i+1
将爆炸;在程序的其他地方是否有支持的
i
定义?我只是想将i初始化为零,i=0..为了启动它…我将在上面进行编辑以包含dealso…我将array.sum视为一个可行的方法..但在我的基本配置中它似乎不受支持..我想我需要一个require语句来说明数组和的具体情况,我可能会使用实现的。这有点复杂,但好处是一旦你熟悉了它,你就可以很快得到一个和、一个积或任何你需要的东西:
cvc.inject(0){sum,element | sum+=element}=>3
(当我将
cvc
初始化为三个简单元素时…)