如何将 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;
}