算法策略
1.算法设计与分析
2.分治法,动态规划,贪心,回溯法,分支限界法,概率算法
什么是递归算法
1.直接调或间接调用自身的算法称为递归算法
2.用函数自身给出定义的函数称为递归函数
举例1:阶乘函数:
阶乘函数可递归地定义:
边界条件与递归方程是递归函数的两个要素,递归函数只有同时具备这两个要素,才能在有限次计算后得出。
举例2:fibonacci数列
fibonacci函数可递归地定义为:
部分代码实现:
public int fibonacci(int n){
if(n==1 || n == 0 ){
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);
}
fibonacci算法的循环实现
部分代码实现如下:
public int forFib(int n){
int [] arr = new int [n+1];
arr[0] = arr[1] =1;
for(int i =2;i<=n;i++){
arr[i] = arr[i-1]+arr[i-2];
}
return arr[n];
}
循环和递归地关系
1.凡是递归能实现的程序都可以用循环实现
2.凡是循环能实现的程序不一定能用递归实现
阶乘的循环实现方法
public int forf(int n){
int s = 1;
for(int i=1;i<=n;i++){
s=s*i;
}
return s;
}
fibonacci
1.循环不需要保存中间结果,一个循环可以完成O(n)
2.递归,逆推的过程O(2的n次方)
循环和递归地对比
1.算法的效率 : 循环的效率>>递归
2.占用空间 : 循环<<递归
3.代码量 :循环>>递归
4.解决问题的思路:循环(复杂)>>递归(简单)
递归算法小结:
优点:
结构清晰,可读性强,而且容易用数学归纳法 来证明算法的正确性,因此它为设计算法。调试程序带来了很大的方便。
缺点:
递归算法的运行效率比较低,无论是耗费的计时时间还是占用的存储空间都比非递归算法要多。
分治的思想:
1.首先把问题分解成K个子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归地进行下去,直到问题规模足够小,很容易求出其解为止。
2.将求出来的小规模的问题的解合并成为一个更大规模的问题的解,自底向上逐步求出原来问题的解。