即使在“.ToList()”调用之后,递归中的产量 return 也没有 return 值
Yield return in recursion doesn't return value even after ".ToList()" call
当我调用生成排列时,第 2 个 GeneratePermutations(list, startCount, permutationCount)
会产生 return 6 次 (yield return permutationList;
)。但出于某种原因,第一个 GetPermutations
中的 result
不包含任何内容,即使我确实对结果调用了 .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;
}
//
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);
}
}
}
//
public static void Swap(ref int[] list, int index1, int index2)
{
int tmp = list[index1];
list[index1] = list[index2];
list[index2] = tmp;
}
}
您的问题是,您永远不会 return 递归调用的结果,并且您一直使用同一个数组。这将是对您的代码的最快修复(不是最好的,但我相信您会从这里弄明白):
IEnumerable<int[]> perms = GeneratePermutations(
new List<int>(permutationList).ToArray(),
startCount + 1, permutationCount);
foreach(int[] perm in perms)
yield return perm;
顺便说一句:您可以使整个 class 静态和通用
当我调用生成排列时,第 2 个 GeneratePermutations(list, startCount, permutationCount)
会产生 return 6 次 (yield return permutationList;
)。但出于某种原因,第一个 GetPermutations
中的 result
不包含任何内容,即使我确实对结果调用了 .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;
}
//
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);
}
}
}
//
public static void Swap(ref int[] list, int index1, int index2)
{
int tmp = list[index1];
list[index1] = list[index2];
list[index2] = tmp;
}
}
您的问题是,您永远不会 return 递归调用的结果,并且您一直使用同一个数组。这将是对您的代码的最快修复(不是最好的,但我相信您会从这里弄明白):
IEnumerable<int[]> perms = GeneratePermutations(
new List<int>(permutationList).ToArray(),
startCount + 1, permutationCount);
foreach(int[] perm in perms)
yield return perm;
顺便说一句:您可以使整个 class 静态和通用