斐波那契

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();

          
        }
    }
}

转载于:https://www.cnblogs.com/menggo/archive/2012/05/07/2487791.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值