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
  • 相关阅读:
    HttpClient-----待补充
    JDK8的新特性
    关于日期转换的知识点(SimpleDateFormat)
    mybatis中的增删改查操作
    mybatis的快速入门
    018 HDFS中,namenode与datanode的交互
    Unit的各种断言
    分组数据
    Javassist学习总结
    hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)
  • 原文地址:https://www.cnblogs.com/itpro/p/2121840.html
Copyright © 2011-2022 走看看