C 递归-数据结构课程-打印所有可能的系列

C 递归-数据结构课程-打印所有可能的系列,c,algorithm,recursion,data-structures,series,C,Algorithm,Recursion,Data Structures,Series,我需要打印所有可能的序列,它们的和等于N; 例如,当n==4时,输出应为: [1, 1, 1, 1] [1, 1, 2] [1, 2, 1] [1, 3] [2, 1, 1] [2, 2] [3, 1] [4] 我解决这个问题的思路是: 打印序列号i不在序列中的序列号 打印序列中的数字i,现在需要找到N-i的和 我的代码: #include <stdio.h> #include <stdlib.h> void printArr(int arr[], int n) {

我需要打印所有可能的序列,它们的和等于N; 例如,当n==4时,输出应为:

[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[1, 3]
[2, 1, 1]
[2, 2]
[3, 1]
[4]
我解决这个问题的思路是: 打印序列号i不在序列中的序列号 打印序列中的数字i,现在需要找到N-i的和

我的代码:

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

void printArr(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {

        printf(" %d ", arr[i]);
    }
    printf("\n");

}

void printAllHelper(int* a,int size, int sum, int used,int index) {
    if (sum == 0) {
        a -= used;
        printArr(a, used);
    }
    else if (sum < 0 || index == size) 
    {
        return;
    }
    else {
        for(int i = 1 ; i <= size ; i ++) 
        {
            printAllHelper(a, size, sum, used, index + 1);
            if (i <= sum)
            {
                *a = i;
            }
            printAllHelper(a+1, size, sum -i, used +1, index + 1);


        }




    }

}

void printAll(int num) {
    int* myArray = (int*)malloc(num * sizeof(int));
    printAllHelper(myArray,num,num,0,0);

}

void main() {
    printAll(4);
}

请试着向我解释一下你的思维方式,以及你是如何处理这类问题的,我想成为前所未有的最好:(……

你的推理不太正确,但你的代码几乎是正确的。你的
else
部分的循环应该是正确的

    for(int i = 1 ; i <= sum ; i ++)  {
        *a = i;
        printAllHelper(a+1, size, sum-i, used+1, index+1);
    }
其基本思想是:“如果第一个数字
i
1
sum
之间的任何数字,那么这些数字的总和为
sum
,其余数字的总和为
sum-i

另外,请注意,您的代码显示了一些改进空间,例如
使用的
索引
变量似乎有点多余。如果不添加大于
总和或小于
1的数字,那么检查
总和<0 | |索引==size
也就没有必要了。因此您也不需要e> size
参数。您的
printAllHelper
可以简化为以下内容:

void printAllHelper(int* a, int sum, int index) {
    if (sum == 0) {
        printArr(a, index);
    } else {
        for(int i = 1 ; i <= sum ; i++)  {
            a[index] = i;
            printAllHelper(a, sum-i, index+1);
        }
    }
}
void printAllHelper(int*a、int-sum、int-index){
如果(总和=0){
printArr(a,索引);
}否则{

对于(int i=1;我非常感谢你的明确回答!我理解你在那里做了什么,希望下次我能自己做这件事。这种问题对我来说太难了:/
 1  1  1  1 
 1  1  2 
 1  2  1 
 1  3 
 2  1  1 
 2  2 
 3  1 
 4
void printAllHelper(int* a, int sum, int index) {
    if (sum == 0) {
        printArr(a, index);
    } else {
        for(int i = 1 ; i <= sum ; i++)  {
            a[index] = i;
            printAllHelper(a, sum-i, index+1);
        }
    }
}