using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现
namespace ConsoleApplication1
{
/// <summary>
/// 斐波那契数列
/// 该类不能被实例化
/// </summary>
//1.斐波那契:任何一个给定元素等于前面两个元素之和(其中,第一和第二个元素为1)
static class Phabe
{
//静态列表,用于存储已经计算得到的数列
private static List<long> phabe;
//静态构造函数
static Phabe()
{
//初始化列表
phabe = new List<long>();
//将前俩个元素加入到数列当中
phabe.Add(1);
phabe.Add(1);
}
/// <summary>
/// 在已有数列的基础上,计算斐波那契数列
/// </summary>
/// <param name="i">计算到第 i 位</param>
private static void Update(int i)
{
//循环计算直到得到第 i 个元素
while (phabe.Count <= i)
{
int count = phabe.Count;
//按照斐波那契数列的定义计算
long temp = phabe[count - 1] + phabe[count - 2];
phabe.Add(temp);
}
}
//为上面私有类做公开接口
/// <summary>
/// 唯一的公开接口,获得第 index 个元素值
/// </summary>
/// <param name="index">希望获取的元素的下标 从0 开始</param>
/// <returns>返回第 index 个元素的值</returns>
public static long GetNumber(int index)
{
//如果该元素已经被计算,则直接从内存中读取;否则,需要延长列表中得斐波那契数列
if (phabe.Count < index + 1)
{
Update(index);
}
//返回值
return phabe[index];
}
/// <summary>
/// 移除掉索引第 index 个后的数列
/// </summary>
/// <param name="index">希望删除掉的开始元素的下标</param>
public static void Remove(int index)
{
//phabe.Count - (index +1)
//RemoveRange 有两个参数,第一个参数是移除元素的开始下表,第二个参数移除元素的数目
phabe.RemoveRange(index, phabe.Count - index);
//清除掉数列中得所有元素
// phabe.Clear();
}
//如果数列中得元素被全部清除,那么就无法再次计算
public static void Clear()
{
phabe.Clear();
}
public static void PrintCurrent()
{
Console.WriteLine("当前的斐波那契数列位:");
for (int i = 0; i < phabe.Count; i++)
{
Console.WriteLine("第 {0} 个元素是 {1}", i, phabe[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
//计算第 30 个元素
//Console.WriteLine("第30个元素是:{0}", Phabe.GetNumber(29));
//计算第 10 个元素,计算的速度要比之前的快,因为结果已经在第一次调用的时候被计算出来
//Console.WriteLine("第10个元素是:{0}", Phabe.GetNumber(9));
//保留控制台口
Phabe.GetNumber(30);
Phabe.PrintCurrent();
Phabe.Remove(5);
Phabe.PrintCurrent();
Console.Read();
}
}
}