斐波那契数列算法,C#

上周抽了一天的时间去6家公司面试,时间太紧都是马马虎虎的,好在这趟面试还是有很多收获的,由此可见自己的理论功底真是差劲的要死,还有语言表达能力。

调侃的来说混了这么久,没有衣××的理论功底,只有雷××的实干精神,这样是不行滴,压根得不到考官们的赏识。

估计给考官的感觉就跟刚毕业的学生差不多一样,问的问题没几个能回答上来的,由此可想而知结果肯定是让人沮丧的。

这几年总结了不少东西,可是就是因为自己懒,导致很多学过的东西几乎没有一个能记得住的,也没有相应的笔记,用到方恨少啊,只能Google,时不时的Google直接导致时间的浪费。

所以警戒大家,学习的时候用点心,勤做笔记和总结,没事的时候翻出来看看加深记忆,这样比遇到问题就Google的效率要高很多,把Google当作学习工具要比把其当成字典要靠谱很多。

扯了半天蛋,还是进入主题吧,面试中有道笔试题,让用递归写出求出制定索引的斐波那契数列值。

先不管斐波那契数列是什么玩意,因为当初我也不知道它是什么东西,不过规律很简单,看过题目就知道索引值都是由前两个索引值的和求出来的。也就是索引1和索引2特别一点,因为值都为1。

要想了解斐波那契数列请参考维基百科(http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)

从来都是敲代码的而不是在纸上写代码,写出来只能表明我的思路,没有进行调试运行的结果肯定是错的。

记得考官看过我写的一个购物商城站点,结果问我购物车如何实现,一下子就问到我了,支支吾吾半天说不上来,直接就回答我说不出来,估计他以为那个网站是别人写的我只是拿来充数而已。

说这些还是希望大家多练习,看再多的书,一个例子不去写,以后在工作中真的什么都做不出来(面试之前还是的复习复习基础知识,不然到时候会很尴尬的)。

对于那些面试官而言,如果一个程序员有几年的工作经验,问一些基础知识,他们答不上来也是情有可原的,不要因为理论知识而放弃一个好的程序员。毕竟这年头招人不容易,毕竟我之前也是做过面试官的,记得那时只要来人我不会问任何一个理论知识,只会告诉他们根据最近的项目遇到的问题提出问题让他们回去写程序,什么时候写出来什么时候上班,结果另人失望,居然没一个来的。毕业生太不靠谱了。

下边贴出具体实现的代码,请大家参考。

原理也没什么复杂的,就是递归获取当前索引的斐波那契数列值,并记录前一条索引的斐波那契数列值。然后就是两个相加就是后一条索引的斐波那契数列值

class Program
    {
        static void Main(string[] args)
        {
            /*
             * 费波那西数列(Fibonacci Sequence),又译费波拿契数、斐波那契数列、费氏数列、黄金分割数列。
             * 在数学上,费波那西数列是以递归的方法来定义:
             * 用文字来说,就是费波那西数列由 0 和 1 开始,之后的费波那西系数就由之前的两数相加。首几个费波那西系数是(OEIS A000045):
             * 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………
             * 特别指出:0不是第一项,而是第零项。
             */
            Console.WriteLine(GetFibonacciSequence(100));
        }
        /// <summary>
        /// 前一索引数列值
        /// </summary>
        private static Int64 f0 = 0;
        /// <summary>
        /// 当前索引数列值
        /// </summary>
        private static Int64 f1 = 1;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="index">索引从0开始</param>
        /// <returns>返回索引项对应的费波那西数列值</returns>
        private static Int64 GetFibonacciSequence(int index)
        {
            #region 0在费波那西数列中比较特殊,因此单独解决它
            if (index == 0)
            {
                return 0;
            }
            #endregion
            for (int i = 0; i < index; i++)
            {
                if (i == index - 1)//因为遍历起始索引为0,故需要对index-1来得到实际索引
                {
                    return GetNumBySum(f0, f1);
                }
                else
                {
                    Int64 c = f1;//中间过度值 存储前一索引值
                    f1 = GetNumBySum(f0, f1);//当前索引数列
                    if (i >= 1)
                    {
                        f0 = c;//存储前一索引数列
                    }
                }
            }
            return f1;
        }
        /// <summary>
        /// 得到斐波那契数列Fn-1之和Fn-2
        /// </summary>
        /// <param name="n1">Fn-1</param>
        /// <param name="n2">Fn-2</param>
        /// <returns>总和</returns>
        private static Int64 GetNumBySum(Int64 n1, Int64 n2)
        {
            return n1 + n2;
        }
    }

大家也可以参考园子内的另一篇文章(http://www.cnblogs.com/cuiweifu/archive/2008/03/05/1091604.html),去面试不讲究执行效率,还是死记硬背该文章的代码,比较靠谱。因为只有短短的4行而已。这里贴出来只是为了大家学习而已。切记学以致用。。。

电脑维修网