递归函数 - 计数置换和忽略置换

时间:2015-03-05 15:43:15

标签: c++ recursion permutation

我遇到了这个问题:

我们正在课堂上进行递归,我不太明白,我想知道是否有人可以帮我解决这个问题

让c(n)是可以从整数 1到n-1 中选择的不同组整数的数量,以便每组中的整数加起来为n(例如, N = 4 = [1 + 1 + 1 + 1] = [1 + 1 + 2] = [2 + 2])。在以下变体下写出c(n)的递归定义:

a)你计算排列。例如,1,2,1和1,1,2是两组,每组加起来为4

b)你忽略了排列

我知道排列是你可以安排一组数字的方式,我的代码下面是否正确?我得到7的回答? 这是我的第a部分的代码:

int recurse (int n);

int main(){
    int a=4;
    int sum_perm;
    sum_perm=recurse(a);
    cout<<sum_perm-1<<endl; 
    //Can I do -1 here because it should be from a group of integers from 1 to n-1?  
return 0;
}

int recurse(int n)
{
    int sum = 1;
    if (n == 1){
        return 1;
  }
      for(int i = 1; i < n; i++){
              sum += recurse(n - i); 

   }       
return sum;
}

对于B部分,如果我不算排列,我在算什么呢? 这是我的b部分代码:

int without (int n, int max);

int main(){
    int a=4, b =3;
    int sum_without;
    sum_without=without(a,b);
    cout<<sum_without<<endl;

system("Pause");
return 0;
}

int without(int n, int max)

{
    if(n == 1 || max == 1){
        return 1;
}               
    else if (n == max){
        return 1 + without(n, n-1);
        }
    else{
        return without(n,max-1) + without(n-max, max);
        }
}

2 个答案:

答案 0 :(得分:0)

您不会显示任何代码来生成产生总和的数字组合。链接到关于partitions的维基文章。

在这种情况下,目标是计算组合和/或排列的数量,这可能是可能的,而无需实际生成一组组合。不确定递归是否有帮助,但如果传递足够的变量,则可以将任何循环转换为递归。

示例&#34;分区&#34;

总和为1的组合:

1

总和为2的两种组合:

1 1
2

总和为3的3种组合:

1 1 1
1 2
3

总和为4的5种组合:

1 1 1 1
1 1 2
1 3
2 2
4

总和为5的7种组合:

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

11个数字组合,总和为6:

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

答案 1 :(得分:0)

我会建议直接考虑组合。虽然看起来更困难的情况是一个简单的规则使它变得微不足道。

  

计算的数字按递减顺序

这要求您跟踪最后一个号码,但确保您不计算1 5然后5 1,因为前者是不可能的。