C++ 递归函数计数和打印1到n-1的分区

C++ 递归函数计数和打印1到n-1的分区,c++,recursion,partition,C++,Recursion,Partition,我正在尝试编写一个递归函数(它必须是递归的)来打印1到n-1的分区和分区数。 例如,4个组合的总和为4: 1 1 1 1 1 1 2 1 3 2 2 我只是在功能上有很多问题。下面的函数不起作用。有人能帮我吗 int partition(int n, int max) { if(n==1||max==1) return(1); int counter = 0; if(n<=max) counter=1; for(int i = 0; n>i; i

我正在尝试编写一个递归函数(它必须是递归的)来打印1到n-1的分区和分区数。 例如,4个组合的总和为4:

1 1 1 1
1 1 2
1 3
2 2

我只是在功能上有很多问题。下面的函数不起作用。有人能帮我吗

 int partition(int n, int max)
{

  if(n==1||max==1)
    return(1);
  int counter = 0;
  if(n<=max)
    counter=1;
  for(int i = 0; n>i; i++){
          n=n-1;
          cout << n << "+"<< i <<"\n";
          counter++;
          partition(n,i);         
        }

  return(counter);
}
int分区(int n,int max)
{
如果(n==1 | | max==1)
申报表(1);
int计数器=0;
if(ni;i++){
n=n-1;

cout这是解决您的问题的一个良好开端:

#include <stdlib.h>
#include <stdio.h>

void partition(int n, int sum, int *summands, int num_summands)
{
  int i;

  if (sum == n)  // base case of recursion
  {
    if (num_summands > 1)  // don't print n by itself
    {
      for (i = 0; i < num_summands; ++i)
        printf("%d ", summands[i]);

      printf("\n");
    }
  }
  else
  {
    /* TODO: fill in recursive case */
    /* Iteratively recurse after appending one additional, varying summand to summands */
    /* It might be easier to first generate all permutations of the sums */
    /* and then figure out how to reduce that down to only the unique sets of summands (think sorting) */
  }
}

int main(int argc, char **argv)
{
  if (argc == 1)
  {
    printf("usage: %s <num>; where num > 1\n", argv[0]);
    return 1;
  }

  int n = atoi(argv[1]);

  if (n <= 1)
  {
    printf("usage: %s <num>; where num > 1\n", argv[0]);
    return 1;
  }

  int summands[n+1];               // NOTE: +1's are to make summands[-1] always safe inside recursion

  summands[0] = 1;                 // NOTE: make summands[-1] == 1 at top level of recursion
  partition(n, 0, summands+1, 0);  // NOTE: +1's are to make summands[-1] always safe inside recursion

  return 0;
}
#包括
#包括
无效分区(int n,int sum,int*summands,int num_summands)
{
int i;
if(sum==n)//递归的基本情况
{
如果(num_summands>1)//不单独打印n
{
对于(i=0;i1\n”,argv[0]);
返回1;
}
int n=atoi(argv[1]);

如果(n这是一个简单的伪代码,请看您是否理解,初始调用是使用recPartition(n,1)

inta[100]
int n
int cnt=0
recPartition(剩余整数,整数indx)

如果(剩余“以下功能不起作用”-它是做什么的?它通过提供的样本输入输出了什么?您是否理解它为什么这样做或怀疑它为什么不起作用?最大值为n-1。输出:请输入数字:4 3+0 2+0 1+0 1+1 2+1计数器:2@WhozCraigSo,给定一个数字n,您希望找到范围内所有唯一的自然数集[1,N)是的,但是在1到N的范围内-1@CSCI_newbie我想出了一个解决方案。这并不是那么容易。这里有一些提示:让你的递归函数取N,当前的和,当前的和数数组和和和数。递归的基本情况是当和=N时。在这种情况下,只需打印即可数组并返回。看看你是否能找出递归的大小写。首先递归地打印出和的所有排列,然后找出如何将它减少到唯一的和数集,可能会更容易。如果我们用4来调用它,它不会打印“1 1 1\n2 1\n2 1\n3\n2 1 1\n2 1\n3 1\n”是的,我们可以很容易地将值保存在外部数组中。编辑ANS更好,但它不是仍然可以进行所有置换吗?例如,在4,“11 2”和“2 1 1”上?OP没有要求所有置换,他在他的示例中需要所有的组合我知道。我是说你的算法多次生成相同的组合(作为彼此的排列)。
int A[100]
int n
int cnt = 0
recPartition(int remaining,int indx)
    if(remaining <0 )
       return
    if(remaining == 0)
        print from 1 to indx in A
        ++cnt
        return
    for i from 1 to remaining
         if(i!=n)
             A[indx] = i
             recPartition(remaining-i,indx+1)