如何将 yield 应用于递归函数
How to apply the yield to recursive functions
我有以下函数,我想使用 yield 运算符将其更改为 return 可枚举。我以前从未使用过该运算符,对为什么我无法让它工作感到有点困惑。
public static void printPermutations(int[] n, int[] states, int idx)
{
if (idx == n.Length)
{
Console.WriteLine(string.Join(", ", n));
return;
}
for (int i = 0; i < states.Length; i++)
{
n[idx] = states[i];
printPermutations(n, states, idx + 1);
}
}
我将函数更改为此,但随后我在 n[idx] = states[i] 上得到一个 System.IndexOutOfRangeException;我不明白为什么。
public static IEnumerable<int[]> printPermutations2(int[] n, int[] states, int idx)
{
if (idx == n.Length)
{
yield return n;
}
for (int i = 0; i < states.Length; i++)
{
n[idx] = states[i];
var perms = printPermutations2(n, states, idx + 1);
foreach(var p in perms)
yield return p;
}
}
yield return
不会退出该方法 - 因此您当前的代码始终运行 for
循环。
添加一个yield break
打断方法:
if (idx == n.Length)
{
yield return n;
yield break;
}
我有以下函数,我想使用 yield 运算符将其更改为 return 可枚举。我以前从未使用过该运算符,对为什么我无法让它工作感到有点困惑。
public static void printPermutations(int[] n, int[] states, int idx)
{
if (idx == n.Length)
{
Console.WriteLine(string.Join(", ", n));
return;
}
for (int i = 0; i < states.Length; i++)
{
n[idx] = states[i];
printPermutations(n, states, idx + 1);
}
}
我将函数更改为此,但随后我在 n[idx] = states[i] 上得到一个 System.IndexOutOfRangeException;我不明白为什么。
public static IEnumerable<int[]> printPermutations2(int[] n, int[] states, int idx)
{
if (idx == n.Length)
{
yield return n;
}
for (int i = 0; i < states.Length; i++)
{
n[idx] = states[i];
var perms = printPermutations2(n, states, idx + 1);
foreach(var p in perms)
yield return p;
}
}
yield return
不会退出该方法 - 因此您当前的代码始终运行 for
循环。
添加一个yield break
打断方法:
if (idx == n.Length)
{
yield return n;
yield break;
}