知识点总结:
递归(两个特点)
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口。
递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归(返回值):当获得最简单的情况后,逐步返回,依次得到复杂的解.
直接/间接递推
直接递归调用就是在函数a(或过程)中直接引用(调用)函数a本身
间接递归调用就是在函数a(或过程)中调用另外一个函数b,而该函数b又引用(调用)了函数a
递归法问题求解一般思路:
列出递归方程/思路
写出递归函数
调用递归函数
1)迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。
递归过程中, 自己调用自己,问题的规模在缩小,这样最终得到问题的解。
遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。
2)递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。
能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。
//二分查找迭代版
int binary_search(int *p,int n,int k){
int i=-1; //i为所查数的序号
int low=0,high=n-1,middle;
while(low<=high){
middle=(low+high)/2;
if(*(p+middle)==k){
i=middle;
break; //找到即跳出循环
}
else if(*(p+middle)>k) //k在序号low和middle之间
high=middle-1;
else //k在序号middle和high之间
low=middle+1;
}
return i; //若k存在则i等于middle,否则为-1
}
//二分查找递归版
int r_search(int arr[], int low, int high, int k)
{
int i,mid;
if (low>high) i=-1;
else
{
mid=(low+high)/2;
if(arr[mid]==k)
i=mid;
else if(arr[mid]>k)
i=r_search(arr, low,mid-1,k);
else
i=r_search(arr, mid+1,high,k);
}
return i;
}