关于递归的学习
一、
1、递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的的问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
递归是一种直接或间接调用自身的函数的一种算法,很常用,一般用于解决三类问题:
- 数据的定义按递归定义的。(FIbonacci函数)
- 数据的结构形式是按递归定义的。(图,树等)
- 问题解法用递归算法实现。(回溯算法)//
2、使用递归的几个条件
- 这个问题是可以分解的,分解出来的问题的解法与之前的大问题的解法相同。
- 是一个可以分解到最后可以解决的问题,也就是有结束的条件,边界条件。
3、递归与循环算法的比较
一般情况下一个问题可以用循环来解决就可以用递归来解决。很相似,但是是两种不同的思路。
递归的优点在于代码简洁,一眼看过去就明白个大概,但是假如调用的层数太多,就会导致内存方面的问题,会占用过多的内存空间。而循环呢,结构简单,道理也简单。对于一些简单的问题,个人感觉循环就完事了。
递归的缺点在于运行的效率低,通常会把递归算法转换为 递推 或者非递归的算法
二、
经典的算法以及一些常用的操作(地方)
1、Fibonacci函数———每一项都是前两项的和
(1)递归实现:递归调用次数太多
int A(int n )//第n项的值
{
if(n<=1) return 1;
return A(n-1)+A(n-2);
}
(2)递推:
int A(int n)
{
int a=1,b=1,c=0;
for(int i=0;i<n;i++)
{
c=a+b;
a=b;
b=c;
}
reurn c;
}
2、整数划分问题———把一个整数n
int A(int n,int max)//n是要拆分的树,max是一个划分
{
if(n<1)return 0;
else if(n==1||m==1) return 1;
else if(n<max) return A(n,n);
else if(n==max) return A(n,m-1)+1;
return A(n,max-1)+A(n-max,max);
}
分治策略
求解一个复杂问题可以将其分解成若干子问题,子问题在分解成更小的问题,直到可以直接求解为止。
条件:
- 问题能够按照某种方法分解为若干个规模较小、相互独立且与原问题类型相同的问题;
- 子问题足够小时可以直接求解;
- 能够将子问题的解组合成原问题的解。
相关的算法:快速排序 ,二分查找等等
经典例题:二分查找
二分查找需要一个默认的前提,那就是查找的数列是有序的。 二分查找的思路比较简单:
1) 选择一个标志i将集合分为二个子集合
2) 判断标志L(i)是否能与要查找的值des相等,相等则直接返回
3) 基于判断的结果决定下步是向左查找还是向右查找然后递归
int binarySearch(int array[], int low, int high, int target)
{
int middle = (low + high)/2;
if(low > high)
{
return -1;
}
if(target == array[middle])
{
return middle;
}
if(target < array[middle])
{
return binarySearch(array, low, middle-1, target);
}
if(target > array[middle])
{
return binarySearch(array, middle+1, high, target);
}
}