• 斐波那契可以考虑的地方?


     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
  • 相关阅读:
    [翻译]跟我一起边译边学之Linux:目录
    [翻译]跟我一起边译边学之Linux:致谢 Acknowledgments
    计算机图形学资源收集01
    计算机图形学资源收集02
    计算机图形学资源收集04
    计算机图形学资源收集03
    C#二十几种设计模式事例下载(源码)
    在WinForm应用程序中嵌入WPF控件
    .net网站与Winform窗体的数据交互(JS调用Winform后台方法实现)
    C#调用rar.exe解压一个rar文件
  • 原文地址:https://www.cnblogs.com/itpro/p/2121840.html
Copyright © 2020-2023  润新知