我正在尝试做一些结合使用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)”执行此操作并且没有递归调用将正常工作。
答案 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;
}
}