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
  • 相关阅读:
    阻止事件冒泡和默认行为,禁止键盘事件
    jquery移除、绑定、触发元素事件
    HTML`CSS_网站页面不同浏览器兼容性问题解决
    computed属性与methods、watched
    call()方法和apply()方法用法总结
    push()、shift()与pop()、unshift()、splice()
    vue指令总结
    fieldset标签
    mysql存储过程定义者
    数据库死锁
  • 原文地址:https://www.cnblogs.com/itpro/p/2121840.html
Copyright © 2011-2022 走看看