在 C 中使用递归打印字符串的所有组合

Posted

技术标签:

【中文标题】在 C 中使用递归打印字符串的所有组合【英文标题】:Print all combination of a string using recursion in C 【发布时间】:2020-08-04 03:14:02 【问题描述】:

我有一个任务是编写代码来打印 N 字符的所有组合。例如,如果输入为 3,则预期输出必须为“aaa aab aac aba ... ccc”。但是我的代码一遍又一遍地循环。这是我的代码。

#include <stdio.h>

#ifndef MAX
#define MAX 5
#endif

void comb(char kar[], int size, int index) 
    // string = aaa
    // lim = 'd'
    char lim = 'a' + size;
    while (index != -1) 

        if (kar[size-1] != lim)  // != c
            for (int i = 0; i < size; i++) 
                printf("%s ", kar);
                kar[size-1]+=1;
            
            return comb(kar, size, index);

         else 

            while (kar[index-1] == lim && index != -1) 
                kar[index-1]='a';
                index--;
            
            kar[index-1] += 1;

            return comb(kar, size, size);
        
    


int main(int argc, char const *argv[]) 
    int n;
    char kar[MAX];

    printf("Input N char : ");
    scanf(" %d", &n);

    for (int j = 0; j < n; j++) 
        kar[j] = 'a';
    

    comb(kar, n, n);

    return 0;

我有点困惑,我不知道错误在哪里。谢谢。

【问题讨论】:

OT:提示:不要写97,而是'a'。它更易读,更清楚地表明了你的意图。 稍微OT:零初始化kar数组像这样:char kar[MAX] = 0 ;,否则你很可能会打印垃圾。 您只能将nindexsize 作为index 参数传递,并且您永远不会在comb 中分配给它,所以很难看出@987654330 @ 可能永远是假的。 【参考方案1】:

问题已解决。我更改了comb() 中的一些元素,并添加了pow() 函数来定义递归限制。

int comb(char kar[], int size, int index, int limit) 

    char lim = 97 + size;
    int limit_value = pow(size,size);
    if(limit == limit_value)
        return 1;

     else 

        if (index < size-1) 
            printf("%s ", kar);
            kar[size-1]+=1;
            return comb(kar, size, index+1, limit+1);

         else 
            int cek = index;
            printf("%s ", kar);
            while (kar[cek] == lim-1 ) 
                kar[cek]=97;
                cek-=1;
            
            kar[cek] += 1;

            return comb(kar, size, 0, limit+1);
        
    

【讨论】:

以上是关于在 C 中使用递归打印字符串的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

算法递归思想

编程珠玑第二章编程求解组合问题

9.9递归和动态规划——打印n对括号的所有有效组合(即左右括号正确配对)

字符串中字符的所有组合(递归方式)

字符串中字符的所有组合(递归方式)

字符串数组全排列——逐个追加组合算法