递归的定义:
递归的体现就是函数自身调用函数自身。
递归与迭代:
在某些问题上,递归所写的代码要比迭代写的代码少。
一般而言,但凡能够被迭代(循环)解决的问题,递归都可以,在某些问题上,迭代是写不出来的,所以只能用递归。
递归其实是分治法的一种实现方式(一种实现思路)。
递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免。
递归的过程:
递归:先递,后归
前进段
指的就是讲问题从大化小
结束段
问题无法再继续化小,则处理当前的问题
返回段
将小问题处理完毕之后,向上返回(有些问题是不需要返回的)
递归的条件:
- 递归必须有一个终止条件,否则会形成死循环。
- 每次调用自身必须接近终止条件
分治法:
分治法是一种算法思想,分治法主要解决的问题是将大问题,进行拆分,拆分成若干个小的问题进行求解,最终将每个小问题的解进行合并。其实,分治法就是一种暴力破解法(穷举),也是一种搜索最优答案的算法。因此很多问题需要将分治与递归相结合去解决。
递归的具体实现过程:
(举例1:)
问题1:计算1+2+3+4+5+...+98+99+100
分析:
f(n)=f(n-1)+n
f(100)=f(99)+100 return 1+2+3+..+99 +100
f(99)=f(98)+99 return 1+2+...+98 +99
...
f(4)=f(3)+4 return 1+2+3+4
f(3)=f(2)+3 return 1+2+3
f(2)=f(1)+2 return 1+2
f(1)=1 return 1
代码:
class demo1{
public static void main(String[] args){
System.out.println(add(100));
}
public static int add(int n){
if(n==1)
return 1;
return n+add(n-1);
}
}
图解:
由此图可以看出递归很占内存
运行结果:
(举例2:)
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(假设三个柱子分别为 X,Y, Z)
这里以四个盘子为例初始位置是X,放到Z上
分析:
代码:
class Hanno{
public static void main(String[] args){
//盘子的个数 出发 中间 目的
hanno(4,"X","Y","Z");
}
public static void hanno(int n,String begin,String mid,String end){
if(n==1){
System.out.println(begin+" -> "+end);
}else{
hanno(n-1,begin,end,mid);
System.out.println(begin+" -> "+end);
hanno(n-1,mid,begin,end);
}
}
}
运行结果:
练习:
打印前20个斐波那契数
class demo1{
public static void main(String[] args){
for(int i=1;i<=20;i++){
System.out.println(cul(i));
}
}
public static int cul(int n){
if(n==2||n==1)
return 1;
return cul(n-1)+cul(n-2);
}
}
运行结果 :