C++ 验证一下,你对递归是不是一知半解

公众号:编程驿站
公众号:编程驿站

1. 前言

无递归,不算法。无论怎样强调递归的重要性,都不为过。受限于计算机的思维能力,计算机的计算找答案的过程就是在不停试错、纠正错误的过程,类似于爱迪生发明灯炮。递归能帮助我们在不知道计算边界的情形下试错。

多函数求解过程,相当于多人协助完成一件事情,必然会有半成品的相互传递和再加工过程。了解递归的内部细节,对于正确使用递归将有巨大帮助。

2. 递归传值

递归调用过程分递进回溯两个过程,传值和计算可以分别在这两个过程中实现。

2.1 递进线

先拿出一个简单的案例。如求解一维数组 int n[5]={5,1,8,9,3}中所有数据相加的。

很认同一个大咖说过的一句话,任何问题都可以当成树来看待。当然,自会有人反对,这么简单的问题,还当成树结构来理解,是不是有点孔乙己了。如果解题的境界仅停留在结果层面上,则追求有点低了。应该是发现、归类。如果能明白所有题目都是一类,便是大境界了。

废话一下后,给一维数组画一个树结构图。不要质疑,只是这棵树只有一条分支。树的定义是空节点都是树,何况还有一条枝桠。

1.png

这道题目,自然是要用递归。递归有两条线,**递进线、回溯线。**这两条线中都可以进行值传递和计算。不言而喻,递进线上的值要从根节点一直传递到叶节点,最终结果要到最后叶节点位置收割。

2.png

如何收割最终结果?

  • 使用全局变量在递进的终点收割结果。

3.png

算法实现:

#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;
}
  • 回溯时返回。递进终点得到最终答案后,向上回溯到父节点。所有父节点只是一个过道,对返回的值不做任何处理,一直返回到最早调用处。

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值