Я новичок в C и пытаюсь написать функцию, которая возвращает все перестановки подмножества размера k строки, используя рекурсию.Например, для строки 'abc' и k = 1 я бы получил 'a', 'b' и 'c', для k = 2 я бы получил 'aa', 'ab', 'ac', 'ba',' bb ',' bc ',' ca ',' cb 'и' cc 'и так далее.
Я хочу вернуть все сгенерированные строки, чтобы я мог делать с ними другие вещи - сейчас он просто распечатывает их, но я буду использовать их позже.Я написал этот код:
#include <stdio.h>
#include <string.h>
#define CHARS "abc"
char *recur(char* prefix, int k, int n);
int main(void)
{
int k = 2; //for example
int n = strlen(CHARS); //set n as length of CHARS
//print string generated by recur
printf("string: %s\n", recur("", k, n));
}
char *recur(char *prefix, int k, int n)
{
//if base case (have already added all letters), return string
if (k == 0)
{
return prefix;
}
//otherwise, add character from CHARS to string
else
{
for (int i = 0; i < n; i++)
{
// for each letter in CHARS, make a new prefix and add a letter from chars to it
int prefLen = strlen(prefix);
char newPrefix[prefLen + 2];
strcpy(newPrefix, prefix);
newPrefix[prefLen] = CHARS[i];
newPrefix[prefLen + 1] = '\0';
return recur(newPrefix, k-1, n);
}
}
}
Однако я получаю сообщение об ошибке 'recur1.c: 40: 1: ошибка: элемент управления может достигнуть конца недействительной функции [-Werror, -Wreturn-type]'при попытке скомпилировать.
Чтобы изучить это немного подробнее, я удалил цикл for, который приводит к обращенной строке:
char *recur(char *prefix, int k, int n)
{
//if base case (have already added all letters), return string
if (k == 0)
{
return prefix;
}
//otherwise, add character from CHARS to string
else
{
//make a new array called newPrefix, copy current prefix into it and add new letter from CHARS
int prefLen = strlen(prefix);
char newPrefix[prefLen + 2];
strcpy(newPrefix, prefix);
newPrefix[prefLen] = CHARS[k-1];
newPrefix[prefLen + 1] = '\0';
return recur(newPrefix, k-1, n);
}
}
После замены этой второй функции код компилируется без каких-либо проблем.Есть идеи, почему версия с циклом for не компилируется?