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

 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
posted @ 2011-07-30 12:04  ITply  阅读(180)  评论(0编辑  收藏  举报