算法篇----斐波拉契数列问题
using System;
using System.Collections.Generic;
namespace NET.MST.Thirteenth.Phabe
{
/// <summary>
/// 使用Phabe类型
/// </summary>
class MainClass
{
static void Main(string[] args)
{
//计算第50个元素
Console.WriteLine("第50个元素是:{0}", Phabe.GetNumber(39));
//计算第10个调用,这个调用将迅速返回,因为结果已经在第一次调用中被计算出来
Console.WriteLine("第10个元素是:{0}", Phabe.GetNumber(9));
Console.Read();
}
}
/// <summary>
/// 斐波拉契数列类型
/// 该类型不能被实例化
/// </summary>
static class Phabe
{
//静态列表,用以存储已经计算得到的数列
private static List<long> _phabe;
/// <summary>
/// 初始化器
/// </summary>
static Phabe()
{
//初始化数列,在一开始使该数列只包含2个元素
_phabe = new List<long>();
_phabe.Add(1);
_phabe.Add(1);
}
/// <summary>
/// 在已经得到的计算结果上,进一步计算斐波拉契数列
/// </summary>
/// <param name="to">计算到第to个元素</param>
private static void Update(int to)
{
//循环计算,直至得到第to个元素
while (_phabe.Count <= to)
{
int count = _phabe.Count;
//利用斐波拉契数列的定义进行计算
long temp = _phabe[count - 1] + _phabe[count - 2];
_phabe.Add(temp);
}
}
/// <summary>
/// 唯一的公开接口,获得第index个元素
/// </summary>
/// <param name="index">希望获取的元素的下标</param>
/// <returns>返回第index个元素的值</returns>
public static long GetNumber(int index)
{
//如果该元素已经在以前被计算,则直接从内存中读取
//否则则需要延长内存中的斐波拉契数列
if (_phabe.Count < (index + 1))
Update(index); ;
return _phabe[index];
}
}
}
广积粮,筑高墙,缓称王