一个套路解决递归问题

在解决一些可以用递归处理的算法题时,无从下笔,没有思路,或有时经常遗漏些步骤。

关于递归的概念这里不再赘述。在面对一个算法题时,如何判断它是否可以用递归解决,以及如何用递归写出来?这是本篇文章的主要内容。

废话不多说,直接先看一道算法题目:

求菲波那切数列的第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);
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值