递归
来源:互联网 发布:淘宝好看的小白鞋 编辑:程序博客网 时间:2024/05/29 18:39
递归:
函数递归调用自身时,系统将在内存创建该函数的一个新副本。新副本和前一个副本中的局部变量彼此独立,不会直接影响。
即:函数递归的过程就是不断创建函数副本的过程,当遇到递归结束的条件时,函数开始返回。就是从当前副本向前一个副本返回,一直返回到初始函数。
例如:
归并排序:
void mergesort(int t[],int low,int high) //low、high为数组下标{ int mid;if(low<high){ mid=(low+high)/2; mergesort(t,low,mid); mergesort(t,mid+1,high); merge(t,low,mid,high); //两个有序子序列合并成一个有序子序列}}
假设待排序元素为:
此时:low=0,high=5
递归执行过程如下:
关于两路归并排序:
两路归并排序,就是将待排序序列划分成长度相等的两部分。一直划分到
单个元素为止。然后两两归并(将两个有序序列合并成一个有序序列)。
其核心操作是将一个一维数组中前后相邻的两个有序序列,合并成一个有序序列。
假设L中的两个子序列:(left、mid是数组的下标):
mid=(left+right)/2
[left,mid]和[mid+1,right]为两个有序的子序列。怎么合并?
先建立一个大小合适的辅助数组。用两个指针i,j分别指向原数组中这两个子序列的第一个元素。比较A[i]和A[j]的大小,将小的元素放到辅助数组中。然后,这个指向小的元素的指针向后移动一位。重复这个比较、移动过程。当有一个指针扫描完成后,把另一个指针未扫描的元素直接复制到辅助数组的最后。再将整个辅助数组的值复制到原序列的对应位置中。
共需要四个循环:
1、 i和j扫描两个序列,均未到达终点,将小的元素放入辅助数组
while(i<=mid&&j<=right){ if(A[i]<A[j]) assist[c++]=A[i++]; else assist[c++]=A[j++];}
2、 如果i到达终点,则将j剩下的元素放到辅助数组
while(j<=right) assist[c++]=A[j++];
3、 如果j到达终点,则将i剩下的元素放到辅助数组
while(i<=mid) assist[c++]=A[i++];
4、 复制到原数组中:
for(k=0;k<right-left+1;k++) A[left+k]=assist[k];
总结:
1、能用while循环,就不用for循环.
因为for循环需要考虑三个条件,而while循环只需考虑一个条件。
//考虑销毁辅助数组
2、函数参数传递(引用的表示方法):
(1)一般的变量 int &a
(2)指针 int *&p
(3)数组
对于数组来说,在传递过程中,实际上本来就是按引用的方式来传递的,而且传递的是实参数组的第一个元素的地址。
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- Java对浮点型数据保留小数点后n位
- pandas入门——数据合并merge函数
- 网易面试题 两种排序方法
- Namespace declaration statement has to be the very first statement in the script
- [资源分享]一个类似我的世界的UNITY分享
- 递归
- Linux系统学习方法——写给小白
- JZOJ1333. H函数 (2017.8B组)
- 神奇的玩具
- HDU 3695:Computer Virus on Planet Pandora(AC自动机裸题,数组实现AC自动机)
- 编译android4.0.1源码遇到的问题
- 泛型
- iframe法在页面中引入相同部分html的应用
- [多校补题]2017 Multi-University Training Contest 3 solutions BY 洪华敦