理解递归

递归二字顾名思义包含两个部分,一个是递,一个是归,中间顺道做点事情,也就是我们程序要完成的任务。我认为递归就像是一个坑,并且这个坑还不可以绕过去,只能跳进去然后再爬出来,然后中间顺带着做点事情,而这个掉进去的过程,其实就是个递的过程,而顺带做的事情,其实就是我们上面说的要完成的任务,特别的,归就是我们跳出坑的过程,我不知到这样写好不好理解,那么结合一个简单例子,就是给定一个集合,然后让你生成他的子集。然后我用递归先实现一下。

#include<iostream>
#include<vector>
using namespace std;
void cur(vector<int> nums,int step,vector<int> result){
	if(step==nums.size()){//这一步其实是告诉我们前面再也没有坑了,你已经再最底层了,没法再往前递了,只能完成任务,然后归。
		for(int i=0;i<result.size();i++){
			cout<<result[i]<<" ";
		}
		cout<<endl;
		return;
	}
	else{
		cur(nums,step+1,result);//第一步的情况下,我们来到了这一步,然后我们又陷入了另一个深坑,只能坚决的慢慢向前爬。其实是递
		result.push_back(nums[step]);//我们扒出了第一个坑,然后在这一步,找到了我们想要的东西,把这个数装进口袋,中间完成的任务
		cur(nums,step+1,result);//但是很不幸,我们又陷进了另一个深坑,然后又得在坑里面往外爬。继续往前递。
	}//这一步其实就是递归结束的地方,其实也就是我们爬出当前坑,回到上一个坑的时候。也就是归的过程
}
int main(){
	vector<int> nums;
	nums.push_back(1);
	nums.push_back(2);
	nums.push_back(3);
	vector<int> result;
	cur(nums,0,result);//这里面是进入第一个坑,并且是一个坑中有坑的坑。
	return 0;
} 

那么现在是上图像的时候了,


解释一下上面的图是怎么回事,一共有有四种颜色,然后相同的颜色代表处于同一水平面上的坑,最外面的那个颜色较浅的是第一个坑,注意是坑中套坑,然后依次进入这个下一层的坑,颜色最深的就是我们递归结束的地方,也就是上面代码中对应的if语句中的那一行,中间的数值表示的是在这个坑中走过去后,我们会得到这个值,也就是对应的是上面的else块中的result.push_back(nums[i])这一行。而颜色最深的那一个格子中下方的数,代表的就是我们这一步要输出的值。下面我们来一步一步的模拟这个程序。

同时注意我们这个跳坑的同学,他不会绕道行走,只会一步一步的向前走。

1:程序进入到第一个颜色浅的坑,然后继续向前陷落,这其实对应的就是上面的else语句中的第一行,然后进入了下一个深坑,就是就是第二深的那个。然后进入下一层,然后继续向前探测(就是上面的if语句)结果发现前面必须还要进入下一个坑,然后继续这个过程。

2:然后我们来到了颜色最深的那一个坑,也就是递归调用的最底层了。这个时候我们就要从口袋里拿出自己一路上捡到的东西了,结果发现啥都没捡到,然后只能输出一个空集,也就是第一个小黑框里面的那个长得像中的那个图案(其实就是表示空集的那个字母)

3:我们跳出了第一个坑,然后出来了以后,我们发现有一个3然后把它捡起来,然后我们口袋里有了一个三了,继续往前走,然后发现又有一个坑,没办法,跳呗,刚好也是一个最深的坑,然后我们就输出自己口袋里有什么东西,好就是一个三了,然后输出即可,就是对应的第二个深色格子中下方的那个3

4:然后再往上爬,发现没有坑了,往上回一步,又没有坑,就又往上回一步,然后我们看到了一个2,捡起来,现在口袋里有了一张2,注意现在只有一个二,你可能奇怪,刚才的三呢,其实就像盗梦空间一样,那个3是你在下一层梦里捡起来的,你可以带回这层世界吗?但是你的才华和记忆却可能带到下一层  梦中去,就相当于这个2我可以带到下一层去,同样的道理,就是上一层的可以往下层带,但是下层的带不到上层去。

5:然后继续往前走,然后就是输出了2,再往前走,捡到了3,然后进入深坑,然后就是输出了23,然后再一步一步的爬出来就好了。

6:然后我们就捡到了1,然后过程与此相同,不再赘述了。

小结:注意这里面每一次从一个颜色较浅的区域,进入一个颜色较深的区域,就是调用了一次递归函数,而颜色较深回到了颜色较浅的地方时是返回了上层的递归。


猜你喜欢

转载自blog.csdn.net/weixin_39587440/article/details/80865716