【问题标题】:IEnumerable yield and recursion - doesn't workIEnumerable 产量和递归 - 不起作用
【发布时间】:2014-06-28 15:38:55
【问题描述】:

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

由于我的代码很复杂,我用斐波那契数列生成了一个简单的示例:

        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)”执行此操作并且没有递归调用就可以了。

【问题讨论】:

  • 这是一个可行的解决方案。 stackoverflow.com/questions/406446/…
  • 我认为你对 yield return 的作用有点困惑 - 它只在返回的序列中产生一个值 by the currently-executing method. Jon Skeet's 来自this SO question的回答。
  • @FarhadJabiyev - 我认为我的问题是由于范围问题,我不知道 yield 仅在当前 exe 中有效。方法。谢谢。
  • @Amiros 欢迎您。祝你好运。

标签: c# recursion ienumerable yield


【解决方案1】:

您需要遍历递归调用返回的可枚举对象并明确地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;
        }
    }

【讨论】:

  • 那是我不想做的事情。有什么方法可以做我之前想做的事情或类似的事情吗?
  • @Amiros 没有别的办法。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多