Совершенно неправильно писать Фибоначчи рекурсивными методами!!
Это старый известный пример того, как хороший/плохой алгоритм влияет на любой проект.
если вы пишете рекурсию Фибоначчи, для вычисления 120
вам нужно 36 лет, чтобы получить результат!!!!!!
public static int Fibonacci(int x)
{ // bad fibonacci recursive code
if (x <= 1)
return 1;
return Fibonacci(x - 1) + Fibonacci(x - 2);
}
в dot net 4.0 есть новое имя типа BigInteger, и вы можете использовать его для улучшения функции.
с помощью системы; используя System.Collections.Generic; используя System.Numerics; // нужна ссылка. к этому собранию
namespace Fibonaci
{
public class CFibonacci
{
public static int Fibonacci(int x)
{
if (x <= 1)
return 1;
return Fibonacci(x - 1) + Fibonacci(x - 2);
}
public static IEnumerable<BigInteger> BigFib(Int64 toNumber)
{
BigInteger previous = 0;
BigInteger current = 1;
for (Int64 y = 1; y <= toNumber; y++)
{
var auxiliar = current;
current += previous;
previous = auxiliar;
yield return current;
}
}
}
}
и вы можете использовать его как
using System;
using System.Linq;
namespace Fibonaci
{
class Program
{
static void Main()
{
foreach (var i in CFibonacci.BigFib(10))
{
Console.WriteLine("{0}", i);
}
var num = 12000;
var fib = CFibonacci.BigFib(num).Last();
Console.WriteLine("fib({0})={1}", num, fib);
Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}
и в этом случае вы можете вычислить 12000
менее чем за секунду. так
Использование рекурсивных методов не всегда является хорошей идеей
Вышеприведенный код импортирован из блога Вахида Насири, написанного на персидском
person
Nasser Hadjloo
schedule
10.05.2010