在解决一些可以用递归处理的算法题时,无从下笔,没有思路,或有时经常遗漏些步骤。
关于递归的概念这里不再赘述。在面对一个算法题时,如何判断它是否可以用递归解决,以及如何用递归写出来?这是本篇文章的主要内容。
废话不多说,直接先看一道算法题目:
求菲波那切数列的第n项
在面对这道常见的题目时,都能想到是可以用递归来解决,那接下来就分析一下它为什么可以用递归来解决?
假定你就站在第n项上,你要知道该项的内容f(n),这是一个大问题,你需要知道前两项的内容f(n-1)与f(n-2),它们是两个子问题;你站在第n-1项上,你要知道该项的内容,也就是说你要解决这个子问题,你需要知道前两项的内容。可知,大问题f(n)的解决方法与子问题f(n-1)的解决方法一样,所以可以用递归解决。
在明白可以用递归解决后,如何写代码也很关键。
在写递归之前,我们需要知道递归的内容是啥,也就是说大问题跟子问题的解决步骤,在上面的例子中,“你要知道该项的内容,你需要知道前两项的内容”是解决大小问题的方法。接着,分析这一步骤返回什么?该例子中显然返回该项的内容。再接着,为该步骤创建函数,设置参数及返回类型。
函数为:long long Fibonacci(int n),其中参数表明第n项,返回值返回第n项的值。
有了这个函数声明之后,我们干脆就站在第n项的角度书写代码,然后,只要我们想方设法利用Fibonacci解决子问题从而解决大问题f(n)就可以了。
在写代码时,先不用着急写边界,而是解决第n项这个大问题。
显然,Fibonacci(n) = Fibonacci(n-1)+Fibonacci(n-2);
所以,在函数中,return Fibonacci(n-1)+Fibonacci(n-2);即可解决大问题,然后再来书写边界
由于n是逐渐减小的,直到0,1时,我们已知它们的值,所以,
边界条件是
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}
上面之所以使用 n<=0,是为了解决非法输入。
整体代码如下 :
long long Fibonacci(int n)
{
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
626

被折叠的 条评论
为什么被折叠?



