zoukankan      html  css  js  c++  java
  • 斐波那契可以考虑的地方?

     class Program
    {
    static void Main(string[] args)
    {
    string s = Console.ReadLine();
    int num;
    if (int.TryParse(s, out num))
    {
    try
    {
    Console.WriteLine(
    "The result is {0}", FibonacciGaiJing3(num));
    }
    catch (Exception)
    {
    Console.WriteLine(
    "出错了,请联系管理员!");
    }
    }
    else
    {
    Console.WriteLine(
    "Invalid Input...");
    }
    }

    /// <summary>
    /// 获取斐波那契数列的某一项值
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    static int Fibonacci(int n)
    {
    if (n == 1 || n == 0)
    {
    return 1;
    }
    else
    {
    return Fibonacci(n - 2) + Fibonacci(n - 1);
    }
    }

    //你的程序,如果别人传进一个负数,会怎么样?
    //会无限递归,导致栈溢出

    //改进1:”我说在Main函数调用递归函数前,先判断一下num……还没说完他就打断:“这怎么行呢?等于把参数检查的职责交给用户,那是十分危险的。”
    //“还没说完,最好是在递归函数里检查参数范围”。他突然笑了,说其实你只要改一个地方,我马上明白了,说把 n==0 || n==1改成n<2。他说是,
    //不过处理负参数并非使用函数的本意,对吧?我说对,这种情况我应该throw一个ArgumentException。
    //他说还有一种不错的方式,只要把递归函数的参数类型改一下,“你说改成什么”,我说uint



    static int FibonacciGaiJing1(int n)
    {
    if (n<2)
    {
    return 1;
    }
    else
    {
    return FibonacciGaiJing1(n - 2) + FibonacciGaiJing1(n - 1);
    }
    }

    //改进2 对参数进行限制
    //Range uint 0 to 4,294,967,295
    static int FibonacciGaiJing2(uint n)
    {
    if (n == 1 || n == 0)
    {
    return 1;
    }
    else
    {
    return FibonacciGaiJing2(n - 2) + FibonacciGaiJing2(n - 1);
    }
    }

    //改进3
    static int FibonacciGaiJing3(int n)
    {
    if (n < 0)
    {
    throw new ArgumentException("参数不能为负数", "参数:n");
    }
    else
    {
    if (n == 1 || n == 0)
    {
    return 1;
    }
    else
    {
    return FibonacciGaiJing3(n - 2) + FibonacciGaiJing3(n - 1);
    }
    }
    }
    }

    由此处得到启示写下这段小代码,这个也是面试题的经典: http://www.cnblogs.com/XmNotes/archive/2010/03/03/1677112.html

    其他实现方式和优缺点可以参考园中文章: http://www.cnblogs.com/hlxs/archive/2011/07/15/2107389.html
  • 相关阅读:
    魔镜完全是被王后问烦了才给她找点事做不再来烦它吧(豆瓣的经典评论)
    调色板QPalette类用法详解(附实例、源码)
    当程序调用dll时获取dll路径,DLL中获取自身的句柄
    把硬盘格式化成ext格式的cpu占用率就下来了
    Delphi XE6 如何设计并使用FireMonkeyStyle
    系统重构
    阅读Google的C++代码规范有感
    VS2010生成安装包制作步骤
    MVC视图中的@Html.xxx(...)
    高性能的JavaScript--加载和执行
  • 原文地址:https://www.cnblogs.com/itpro/p/2121840.html
Copyright © 2011-2022 走看看