递归
一、递归的概念
理解:递归就是方法定义中调用方法的一种现象。
递归使用时的注意事项
1、递归要有出口,不能是死递归
2、递归的次数不宜过多,否则会溢出
递归可以解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
重点:递归算法一定要注意的是出口,必须要有一个明确的条件。到达这个条件时,就不再递归了。
二、程序案例
1、请计算5的阶乘5!
普通方法
分析:5!=5×4×3×2×1
利用for循环进行
public static void main(String[] args) {
int sum=1;
for(int i=1;i<=5;i++){
sum=sum*i;
}
System.out.println(sum);
}
例比计算n的阶乘:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入计算的阶乘:");
int n=sc.nextInt();
int sum=1;
for(int i=1;i<=n;i++){
sum=sum*i;
}
System.out.println(sum);
}
递归的方法
public static int jiecheng(int n){
if(n==1){
return 1;
}else{
return n*jiecheng(n-1);
}
}
public static void main(String[] args) {
int sum=jiecheng(5);
System.out.println(sum);
}
2、兔子问题(斐波那契数列)
有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问第二十个月的兔子对数为多少?
分析:
月份: 1 2 3 4 5 6 7…
兔子对数: 1 1 2 3 5 8 13…
结论:由此,我们可以发现从第三个月开始,兔子对数是前两个月的兔子对数之和。
普通方法
在用普通方法思考时,我想的是用数组的方式。代码如下:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入月份:");
int a=sc.nextInt();
int arr[]=new int[a];
arr[0]=1;
arr[1]=1;
for(int i=2;i<arr.length;i++){
arr[i]=arr[i-1]+arr[i-2];
}
System.out.println(arr[a-1]);
}
递归方法
分析:1月份与2月份的兔子对数都为1,则出口为当n==1时都返回1.
public static int tuzi(int n){
if(n==1||n==2){
return 1;
}else{
return tuzi(n-1)+tuzi(n-2);
}
}
public static void main(String[] args) {
int sum=tuzi(20);
System.out.println(sum);
}