数据结构-递归和分治
递归算法:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,函数自己调用自己,或者是函数调用了一系列其他函数,而其中的一个函数最终又再次调用了第一个函数。
分治思想:将一个规模为N的问题,可以分解为k个规模较小的子问题,这些问题相互独立且与原问题相同,可以递归的求解这些问题,然后将各个自问题的解合并得到原问题的解。
递归应用-求解n个阶乘问题
int factorial(int n){
if(n==0)
return 1;
else
return n*factorial(n-1);
}
递归应用-求解汉诺塔问题
算法思想:
- 将圆柱A上最上面的n-1个盘子移动到辅助柱B
- 移动圆柱A上第n个盘子到目标柱C上
- 将辅助柱B上的n-1个盘子移动到目标柱C
本例中求解汉诺塔问题,实现思路及代码来自王治和教授数据结构课堂的总结
void move(int count,int start,int finish,int temp){
if(count==1){
cout<<"move disk "<<count<<" from "<<start<<" to "<<finish<<endl;
}
else{
move(count-1,start,temp,finish);
cout<<"move disk "<<count<<" from "<<start<<" to "<<finish<<endl;
move(count-1,temp,finish,start);
}
}
递归能够解决的问题大致如下三类:
- 数据的定义是按递归定义的。如Fibonacci函数
- 问题解法按递归算法实现。如Hanoi问题
- 数据的结构形式是按递归定义的。如二叉树、广义表等