递归

来源:互联网 发布:淘宝好看的小白鞋 编辑:程序博客网 时间: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中的两个子序列:(leftmid是数组的下标):


mid=(left+right)/2

[left,mid]和[mid+1,right]为两个有序的子序列。

怎么合并?

先建立一个大小合适的辅助数组。用两个指针ij分别指向原数组中这两个子序列的第一个元素。比较A[i]A[j]的大小,将小的元素放到辅助数组中。然后,这个指向小的元素的指针向后移动一位。重复这个比较、移动过程。当有一个指针扫描完成后,把另一个指针未扫描的元素直接复制到辅助数组的最后。再将整个辅助数组的值复制到原序列的对应位置中。

共需要四个循环:

1、  ij扫描两个序列,均未到达终点,将小的元素放入辅助数组

     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)数组

对于数组来说,在传递过程中,实际上本来就是按引用的方式来传递的,而且传递的是实参数组的第一个元素的地址。


原创粉丝点击