IEnumerable yield和recursion - 不起作用

时间:2014-05-11 05:37:44

标签: c# recursion ienumerable yield

我正在尝试做一些结合使用yield和递归的东西,我真的不明白为什么它不起作用。

由于我的代码很复杂,我用Fibonacci系列生成了一个简单的例子:

        private IEnumerable<int> fib()
        {
            int a1 = 1, a2 = 1;
            return fibRec(a1, a2);
        }

        private IEnumerable<int> fibRec(int a, int b)
        {
            int tmp = a;
            a = b;
            b = tmp + b;
            yield return a;
            fibRec(a, b);
        }

现在,我知道有1000种解决斐波那契的方法,但这不是这里的交易。  这只是一个例子

这是我的电话:

var nums = fib().Take(50).ToList();

递归呼叫没有“工作”。
我得到了第一次工作正常工作,我并没有真正理解为什么当我再次呼唤自己时突然停止的原因。 使用“while(true)”执行此操作并且没有递归调用将正常工作。

1 个答案:

答案 0 :(得分:3)

您需要迭代遍历递归调用返回的枚举,并明确地对每个项进行yield return

    private IEnumerable<int> fibRec(int a, int b)
    {
        int tmp = a;
        a = b;
        b = tmp + b;
        yield return a;
        foreach(int val in fibRec(a, b))
        {
             yield return val;
        }
    }