递归
递归(recursion )是指在定义自身的同时又出现了对自身的引用。
如果一个算法直接或间接地调用自己,则称这个算法是一个递归算法。
任何一个有意义的递归算法总是由两部分组成:递归调用与递归终止条件。
德罗斯特效应(Droste effect)是递归的一种视觉形式,是指一张图片的某个部分与整张图片相同,如此产生无限循环。这种图片可以通过名为 Mathmap的数学软件制作出来
注意:其实上面不是递归,递归不是无限循环。递归有去有回,上图有去无回。
示例1:1+2+3+4......+100=?
算法1:循环算法
int sum = 0;
for(int i=1;i<=100;i++){
sum += i;
}
System.out.println(sum);
时间复杂度T(n) =O(n)
空间复杂度S(n) =O(1)
算法2:简单算法
System.out.println((1+100)*100/2);
System.out.println(100*101/2);//0+1+2+..100=?
时间复杂度T(n) =O(1)
空间复杂度S(n) =O(1)
算法3:递归算法
sum(100) = sum(99) + 100
sum(99) = sum(98) + 99
...
sum(3) = sum(2) + 3;
sum(2) = sum(1) +2;
sum(1) = 1;
public static int sum(int n){
if(n>1){
return sum(n-1)+n;
}else{
return 1;
}
}
时间复杂度T(n) =O(n)
空间复杂度S(n) =O(n)
总结
1.递归的调用过程
每递归调用一次方法,都会在内存中分配空间
每执行完一次方法,都会释放相应的空间
2.递归的优缺点
缺点:占用内存多,效率低下
优点:思路和代码简单
3.递归的适用场合
1.一个问题可被分解为若干层简单的子问题
2.子问题和其上层问题的解决方案一致
3.外层问题的解决依赖于子问题的解决
4.一定要有递归的结束条件*