Генерировать все возможные комбинации с помощью рекурсии

#python #c #recursion #combinations

#python #c #рекурсия #комбинации

Вопрос:

Я хочу сгенерировать все возможные комбинации с помощью рекурсии, нашел решение на python, но не знаю, как его реализовать на C.

 def combinations(text):
    if "?" in text:
        for char in "abc":
            combinations(text.replace("?", char, 1))
    else:
        print(text)
combinations("???")
 

Что дает нам все возможные комбинации длины 3 с использованием abc.

Мой код на C выглядит примерно так, но он работает не так, как должен быть.

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

char chars[4] = "abc";

void combinations(int repeat, char *result){
    if (repeat--){
        for (int i = 0; i < 3; i  ){
            result[strlen(result)] = chars[i];
            combinations(repeat, result);
        }
    }
    else{
        printf("%sn", result);
        result[0] = '';
    }
}

int main(){
    char *res = (char *)malloc(2000);
    combinations(3, res);
}
 

Я ожидаю, что он выводит все возможные уникальные комбинации длины 3 с использованием abc:

 aaa
aab
aac
aba
...
 

Какие выходные данные кода C:

 aaa
baa
caa
baaa
...
 

Комментарии:

1. Почему бы и нет #include <string.h> и использовать strlen вместо домашней выпечки len ?

2. @Stef, да, const ключевое слово должно использоваться, чтобы прояснить намерение и помочь выявить ошибки реализации, но без него нет риска сбоя, если реализация фактически не пытается изменить строку. В C все было бы иначе, но там риск был бы связан с ошибками компиляции, а не с сбоями во время выполнения.

3. @JohnBollinger В последние дни я был погружен в так много python, что на секунду я действительно забыл, что настоящие языки программирования компилируются: ‘(

4. Вам нужно всего 4 символа (не 2000), если вы делаете это онлайн с обратным отслеживанием, если вы не собираетесь сохранять результаты?