static IEnumerable<int> FibonacciByLength(int length)
{
if (length <= 1)
yield return 1;
else
yield return FibonacciByLength(length - 1).Last() +
FibonacciByLength(length - 2).Last();
}
这段代码仅返回最后一个值,但我希望它返回所有这些值。
如果您不受传递给方法的参数的限制,建议您执行以下操作
static IEnumerable<int> FibonacciByLength(int maxValues, int valuesCalculatedSoFar = 0, int previousValue1 = 0, int previousValue2 = 0)
{
int nextValue;
if (valuesCalculatedSoFar < 2)
{
nextValue = 1;
}
else
{
nextValue = previousValue1 + previousValue2;
}
yield return nextValue;
valuesCalculatedSoFar++;
if (valuesCalculatedSoFar < maxValues)
{
foreach(var value in FibonacciByLength(maxValues, valuesCalculatedSoFar, previousValue2, nextValue))
{
yield return value;
}
}
}
您将使用哪个来调用
var values = FibonacciByLength(10).ToList();
这样做的原因是您避免不必要的呼叫。使用此方法,如果要计算斐波纳契序列的前10个值,它将仅调用FibonacciByLength 10次。在对FibonacciByLength的每次调用中,您都传递了计算下一个值所需的值,因此您不必重新计算它。
使用Arturo建议的方法,您将调用2089次。这是因为有多个调用,例如FibonacciByLength(length-1).Last(),这需要重新计算整个序列直到传入的长度才得到最后一个值。如果您只能传递长度值,则没有其他选择,必须忍受将要进行的指数级呼叫。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句