Когда я делаю вызов перестановок поколений, второй GeneratePermutations(list, startCount, permutationCount)
действительно возвращает доход 6 раз (yield return permutationList;
). Но по какой-то причине result
в первом GetPermutations
не содержит ничего, хотя я и вызвал .ToList()
на результат.Возврат доходности в рекурсии не возвращает значения даже после вызова «.ToList()»
У этого есть что-нибудь, чтобы сделать рекурсию?
Test.cs
IEnumerable<int[]> actual = _sut.GetPermutations(3).ToList();
Perm.cs
public class Perm
{
public IEnumerable<int[]> GetPermutations(int permutationCount)
{
int[] permutationList = Enumerable.Range(1, permutationCount).ToArray();
IEnumerable<int[]> result = GeneratePermutations(permutationList, 0, permutationCount - 1).ToList();
// Doesn't contain any value!
return result;
}
// http://stackoverflow.com/a/756083/4035
private IEnumerable<int[]> GeneratePermutations(int[] permutationList, int startCount, int permutationCount)
{
if (startCount == permutationCount)
{
// Does return 6 times here.
yield return permutationList;
}
else
{
for (int i = startCount; i <= permutationCount; i++)
{
Swap(ref permutationList, startCount, i);
GeneratePermutations(permutationList, startCount + 1, permutationCount).ToList();
Swap(ref permutationList, startCount, i);
}
}
}
// http://stackoverflow.com/a/2094316/4035
public static void Swap(ref int[] list, int index1, int index2)
{
int tmp = list[index1];
list[index1] = list[index2];
list[index2] = tmp;
}
}
Независимо от вашей проблемы: получите свой тип данных quirkiness, отсортированный в 'GetPermutations()'. Вам не нужен 'List': выбросьте кастинг. –
@QualityCatalyst: Я просто изменил тип, как это было предложено на всякий случай как в источнике, так и в моем коде. – Sung
Обратите внимание, что 'ref' не требуется в методе' Swap'. –