计算斐波那契数列

斐波那契数列的详细定义可以查看斐波那契数列

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

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

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

从上图可以看出,非递归方法非常快,时间复杂度是线性的,而递归方法,则要慢很多,基本感觉是指数级增长


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值