公众号:编程驿站
公众号:编程驿站
1. 前言
无递归,不算法。无论怎样强调递归的重要性,都不为过。受限于计算机的思维能力,计算机的计算找答案的过程就是在不停试错、纠正错误的过程,类似于爱迪生发明灯炮。递归能帮助我们在不知道计算边界的情形下试错。
多函数求解过程,相当于多人协助完成一件事情,必然会有半成品的相互传递和再加工过程。了解递归的内部细节,对于正确使用递归将有巨大帮助。
2. 递归传值
递归调用过程分递进和回溯两个过程,传值和计算可以分别在这两个过程中实现。
2.1 递进线
先拿出一个简单的案例。如求解一维数组 int n[5]={5,1,8,9,3}
中所有数据相加的。
很认同一个大咖说过的一句话,任何问题都可以当成树来看待。当然,自会有人反对,这么简单的问题,还当成树结构来理解,是不是有点孔乙己了。如果解题的境界仅停留在结果层面上,则追求有点低了。应该是发现、归类。如果能明白所有题目都是一类,便是大境界了。
废话一下后,给一维数组画一个树结构图。不要质疑,只是这棵树只有一条分支。树的定义是空节点都是树,何况还有一条枝桠。
这道题目,自然是要用递归。递归有两条线,**递进线、回溯线。**这两条线中都可以进行值传递和计算。不言而喻,递进线上的值要从根节点一直传递到叶节点,最终结果要到最后叶节点位置收割。
如何收割最终结果?
- 使用全局变量在递进的终点收割结果。
算法实现:
#include <iostream>
using namespace std;
int n[]= {5,1,8,9,3};
//全局变量
int sum=0;
/*
* idx 递进深度
* s 父节点传递给子节点的值
*/
void getSum(int idx,int s) {//递进终点if( idx==4 ) {//父节点传递过来的值和自身值求和,存储在全局变量中sum= s+n[idx];return;}//不是叶节点,用当前节点的值加上父节点传递过来的值s+=n[idx];getSum(idx+1,s);
}
int main(int argc, char** argv) {getSum(0,0);cout<<sum;return 0;
}
- 回溯时返回。递进终点得到最终答案后,向上回溯到父节点。所有父节点只是一个过道,对返回的值不做任何处理,一直返回到最早调用处。