您的位置:首页 > 其它

计算斐波那契数列

2013-01-31 19:27 246 查看
斐波那契数列的详细定义可以查看斐波那契数列

看一些算法书,提到递归,经常会拿斐波那契数列来举例,所以今天就写点程序,简单讨论一下。

这里包括了两个方法,一个是递归计算,效率极其低下;另一种,就是直接利用循环计算,效率是就好很多,下面是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace FibonacciNumber
{
class Program
{
// F(0) = F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2)
static void Main(string[] args)
{
Console.WriteLine("N\tValue\tCost(ms)");
for (ulong i = 1; i <= 50; ++i)
{
KeepTime(FibonacciNonRecursive, i);
}

Console.WriteLine("N\tValue\tCost(ms)");
for (ulong i = 1; i <= 50; ++i)
{
KeepTime(FibonacciRecursive, i);
}
}

static void KeepTime(Func<ulong, ulong> action, ulong index)
{
ulong value = 0;
Stopwatch time = new Stopwatch();
time.Start();
value = action(index);
time.Stop();
Console.WriteLine("{0}\t{1}\t{2}", index, value, time.ElapsedMilliseconds);
}

// Calculate Fibonacci Number recursively
static ulong FibonacciRecursive(ulong n)
{
if (n <= 1)
{
return 1;
}
else
{
return FibonacciRecursive(n - 1) + FibonacciRecursive(n - 2);
}
}

// Calculate Fibonacci Number non-recursively
static ulong FibonacciNonRecursive(ulong n)
{
if (n <= 1)
{
return 1;
}
else
{
ulong minusOne = 1;
ulong minusTwo = 1;
ulong value = 0;
for (ulong i = 2; i <= n; ++i)
{
value = minusOne + minusTwo;
minusTwo = minusOne;
minusOne = value;
}
return value;
}
}
}
}


FibonacciRecursive方法是递归算法

FibonacciNonRecursive方法是非递归算法

下面是两个方法计算前50个数的时间:

NValueFibonacciNonRecursive Cost(ms)FibonacciRecursive Cost(ms)
1100
2200
3300
4500
5800
61300
72100
83400
95500
108900
1114400
1223300
1337700
1461000
1598700
16159700
17258400
18418100
19676500
201094600
211771100
222865700
234636800
247502501
2512139302
2619641804
2731781106
28514229011
29832040018
301346269029
312178309047
323524578077
3357028870122
3492274650199
35149303520324
36241578170526
37390881690857
386324598601390
3910233415502267
4016558014103668
4126791429605902
4243349443709505
43701408733015374
441134903170024746
451836311903039804
462971215073064230
4748075269760103802
4877787420490168007
49125862690250271728
50203650110740439400
从上图可以看出,非递归方法非常快,时间复杂度是线性的,而递归方法,则要慢很多,基本感觉是指数级增长
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: