Проблема могла быть задана в другом месте, но я не могу найти решение своей проблемы. Проблема не в языке c, ту же проблему можно задать в python. Задача состоит в том, чтобы алгоритм сгенерировал список строк типа Enumerable.Range
, но символы не ограничены только 1, 2, 3 ... но могут быть любой последовательностью символов. Самый простой пример:
TestCase 1 :
ввод:
baseChars: ['a', 'b'],
обязательно длина строки: 2
вывод:
['aa', 'ab', 'ba', 'bb']
TestCase 2 :
baseChars: ['a', 'b']
требуемая длина строки: 1
вывод:
['a', 'b']
Функция работает хорошо:
static IList<string> baseChars = new List<string>() { "0", "1", "2", "3" };
static void CharsRange1(string prefix, int pos)
{
if (pos == 1)
{
foreach (string s in baseChars)
{
Console.WriteLine(prefix + s);
}
}
else
{
foreach (string s in baseChars)
{
CharsRange1(prefix + s, pos - 1);
}
}
}
Ожидаемый и фактический вывод (новые строки заменены запятой на для экономии места):
000, 001, 002, 003, 010, 011, 012, 013, 020, 021, 022, 023, 030, 031, 032, 033, 100, 101, 102 , 103, 110, 111, 112, 113, 120, 121, 122, 123, 130, 131, 132, 133, 200, 201, 202, 203, 210, 211, 212, 213, 220, 221, 222, 223 , 230, 231, 232, 233, 300, 301, 302, 303, 310, 311, 312, 313, 320, 321, 322, 323, 330, 331, 332, 333
проблема заключается в том, чтобы включить эту функцию в библиотеку, поэтому тип возврата должен быть IEnumerable<string>
, чтобы память не взорвалась накануне n для большого ввода. но мой код ничего не может вернуть :
static IEnumerable<string> CharsRange2(string prefix, int pos)
{
if (pos == 1)
{
foreach (string s in baseChars)
{
yield return prefix + s;
}
}
else
{
foreach (string s in baseChars)
{
// here if i yield return then won't compile
// i thought at the end of recursive loop it will return
CharsRange2(prefix + s, pos - 1);
}
}
}
основной:
static void Main(string[] args)
{
//CharsRange1("", 3);//working
foreach (string s in CharsRange2("", 3))
{
Console.WriteLine(s);//nothing
}
Console.WriteLine("end");
Console.ReadKey();
}
Кто-нибудь может помочь? Я поместил свой код в github . Также рекомендуется, если вы можете изменить мою реализацию на нерекурсивную, но сохранить возвращаемый тип функции.