算法思考:如何写出一个递归算法?(最大子列和问题)

本文探讨了如何运用递归算法解决最大子列和问题,指出递归在思维上的简洁性,虽然在硬件实现上可能复杂。递归函数的关键在于相同的执行操作和不同的初始条件,以及明确的终止条件和返回结果。通过斐波那契数列的反向思考,解释了递归的思维方式。最后,以PTA的最大子列和问题为例,展示了“分而治之”的递归解决方案。

有这么一种感觉,递归算法在思考角度上是“显得很懒惰的”,为什么这么说呢?

因为递归的本质是自己调用自己,机器这么做很干净利落,一步一步来就好,只要把每一次递归的条件改动一下就好。

但是我们人脑在思考递归时就显得很吃力……(因为在硬件的底层实现,递归是很恐怖的,要不断的开新栈,然后再逐个返回收栈,可能是我脑子的缓存不够用吧,多想那么几个复杂的就崩了)

不过,要写出一个递归函数还是很容易的。

递归函数的要义在于,每一次执行的操作是一样的,不同的是每一次的初始条件,所以与其说自己调用自己,不如理解成每次调用一个一摸一样的函数。

然后,有这个想法开始,就可以往下继续像,如果这么一直调用下去,什么时候停止呢?所以就需要有一个终止的条件。

在之后,调用一个函数是希望得到某一个结果的,那么这个return的结果就需要写出来,包括最底层的return和每一层的return。

换一种思维来考虑递归

比如最常见斐波那契数列,我们正常的思维是从零到一,而递归的实现,是“实现1需要的是0”,所以正好是反过来的。所以这样来想,对于像我这种顺序思考的大脑来说,确实是很偷懒的。

一个实现的例子

例子来自于PTA的“最大子列和”问题,其中的一种方法是“分而治之”(和归并排序的感觉很像,都是递归嘛),第一眼看上去有点吓人,不过逻辑理顺,然后一步步实现就好了。

/* 使用函数调用的方法 */
#include <cstdio>
/* 分而治之的方法 */
/* 递归的方法 */
int max3 (int A, int B, int C)
{
    return A > B ? A > C ? A : C : B > C ? B : C;
}
int divideLeftRight(int listNum[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值