使用递归生成可能的值分配结果

时间:2015-01-21 18:56:37

标签: algorithm recursion random

我试图想出一个递归算法,在完全随机的情况下生成所有可能的子 - 父分配可能性。

例如,假设我有3个孩子和2个父母,所有孩子将被随机分配给每个父母,并有以下可能的结果

   Parent 1       Parent 2

   0 Children     3 Children
   1 Children     2 Children
   2 Children     1 Children 
   3 Children     0 Children   

我一直试图绕过这样的方式,递归地提供孩子的数量和父母的数量以及其他变量以跟踪当前状态,但一直无法找到任何有效的。它需要为任何特定数量的父母和孩子工作。

有没有人有任何想法?我用Java编码,虽然它不是代码,而是我需要帮助的算法。

3 个答案:

答案 0 :(得分:2)

假设你有n个孩子和k个父母。然后,以下算法(在伪java中)应该起作用:

int[] childrensForParent = new int[k];

/**
* Method assigns numberOfChildren children to parents with indices from 
* parentIndex to k-1
*/
void assignChildren(int parentIndex, int numberOfChildren) {
    if(parentIndex==k-1) {
         //All children left go to the last parent in a row
         childrensForParent[parentIndex] = numberOfChildren;
         //Do something with the result
         output(childrensForParent);
         return;
    } 
    for(int childrenCount= 0; childrenCount<=numberOfChildren; childrenCount++) {
        //assign children to current parent
        childrensForParent[parentIndex] = childrenCount;
        //assign children that left to next parents
        assignChildren(parentIndex+1, numberOfChildren-childrenCount);
    }
}

//Method call
assignChildren(0,n);

简短解释:

  1. 如果您只有一位家长,则分配所有孩子
  2. 否则,如果您有k个父母和n个孩子
    1. 为每个可能的孩子计算x(从0到n
      1. x个孩子分配给当前的父级
      2. n-x个孩子分配给剩余的(k-1)父母(递归电话)。
  3. 其他信息: 上述算法会将n的所有非负分区生成k个部分。看看这些文章:

答案 1 :(得分:1)

这一切都是完全未经测试的,但您可以从以下逻辑/伪代码开始:

// Define your starting objects/data
define a parent object that has a list field of children
define "parents" as an array of parent objects
define "children" as an array of children objects

// Prepare the data
randomize the "children" array via a shuffling algorithm

// Define your recursive method
define recursiveAssignChildren(parents, children):
    if children is empty, exit method
    take the first element of "children" and assign it to a random parent
    define lessChildren as children, excluding the first element that was already assigned to a parent
    call recursiveAssignChildren(parents, lessChildren)

// Call the recursive method to start process
call recursiveAssignChildren(parents, children)

答案 2 :(得分:0)

问题制定者所戴的封面很多问题。这可以通过制作问题来实现,因为有人告诉你一个谜语(长句,少信息)。所以,要发现这个问题,你会这样想:由于孩子需要以各种可能的方式分配给父母,而不是处理这个问题,你有两个数字n1,n2(分别是父母的子女数)你想要使用n2添加添加n1所以如果你有3个孩子需要分配给2个父母,你想要使用2个额外的操作形成3

   void generateAll(int c, int p, string str)
{
    if (c == 0 && p == 0)
    {
        cout << str << endl;
        return;
    }
    // if there are no parents and c > 0 then no children going to be asigned to any parent
    if (p == 0 && c > 0)
        return;
    // loop throug number of children 
    for (int i = 0; i <= c; i++)
    {
        generateAll(c - i, p - 1, str + "\t"+ toString(i));
    }
}