Вывести все комбинации строк с использованием рекурсии в C - PullRequest
1 голос
/ 21 апреля 2020

У меня есть задание написать код, который печатает все комбинации N символов. Например, если входное значение равно 3, ожидаемое значение должно быть « aaa aab aa c 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;
}

Я немного запутался и понятия не имею, в чем ошибка. Спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Проблема была решена. Я изменил некоторые элементы в 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);
        }
    }
}
...