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

Posted

技术标签:

【中文标题】递归 - 数据结构课程 - 打印所有可能的系列【英文标题】:recursion - data structure course - print all possible series 【发布时间】:2020-03-20 15:54:27 【问题描述】:

我需要打印所有可能的系列,它们的总和等于 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);

我的输出:

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

请尝试向我解释你的思维方式,以及你是如何解决这类问题的,我想成为前所未有的最好的人:(.....

【问题讨论】:

【参考方案1】:

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

    for(int i = 1 ; i <= sum ; i ++)  
        *a = i;
        printAllHelper(a+1, size, sum-i, used+1, index+1);
    

有了这个,我得到了输出

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

这个想法基本上是:“如果第一个数字 i 是从 1sum 的任何数字,其余数字总和为 sum - i,则数字总和为 sum。”

另外,请注意,您的代码显示了一些改进空间,例如usedindex 变量似乎有点多余。并且不添加大于sum 或小于1 的数字,也不需要检查sum &lt; 0 || index == size。因此,您也不需要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);
        
    

(注意:C 不是我的母语,如果您看到更多需要改进的地方,请发表评论。)

【讨论】:

非常感谢您的明确回答!我明白你在那里做了什么,希望下次我能自己做这件事。这种问题对我来说太难了:/

以上是关于递归 - 数据结构课程 - 打印所有可能的系列的主要内容,如果未能解决你的问题,请参考以下文章

编写一个打印所有组合的通用函数。没有递归[重复]

Excel数据表格排版及输出打印技巧大全视频课程

使用递归从 char 列表中打印 n 长度组合

Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃

如何(廉价)计算 n 个可能元素的所有可能的长度-r 组合

为什么我的递归函数不能遍历堆栈中的所有数据?