学堂在线 邓老师《数据结构》笔记
分而治之:把大问题分成小问题,递归式求解
为求解一个大规模问题,可以将其划分为若干(通常两个)子问题,规模大体相当。分别求解子问题。由子问题的解,得到原问题的解。
数组求和:
sum(int A[],int lo,int hi){
if(lo==hi) return A[lo];//递归的一个判断条件
int mi=(lo+hi)>>1;
return sum(A,lo,mi)+sum(A,mi+1,hi);
}
减而治之:
求解一个大规模问题,可以将其划分为两个子问题:其一平凡(1个数的问题),另一个可能和原问题相似,但是规模缩减(可以递归)。
分别求解子问题,由子问题的解,得到原问题的解。
递归的两种表现形式:
-
递归跟踪:
直观形象,仅适用于简明的递归模式
-
递归方程:
间接抽象,适用于复杂的递归模式
eg:数组倒置问题:
问题 lo-hi -> lo+1,hi-1
void reverse(int*A ,int lo,int hi){
if(lo<hi){
swap(A[lo],A[hi]);
reverse(A,lo+1,hi-1);
}else if(){//用于考虑特殊情况,边界情况
}
}