遞歸
1、遞歸次數不要太多,太占內存
2、遞歸一定要有出口
3、構造方法不能遞歸使用
三種方法實現實例:
package test17_digui;
import java.util.Scanner;
/*
* 題目:有一對兔子,從出生后第3個月起每個月都生1對兔子,小兔子第三個月后也可以生一對兔子,
* 假如兔子不死,在指定月份時刻一共可以有多少對兔子
*
* 分析:
* 第一個月:1
* 第二個月:1
* 第三個月:2
* 第四個月:3
* 第五個月:5
* 第六個月:8
* 。。。。。
*
* 其實指定月份兔子的總數為此月之前兩個月兔子總數之和。
*
* 實現3種方法
* 1、數組實現
* 2、相鄰變量實現
* 3、遞歸實現
*/
public class DiGuiDemo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("請輸入當前月份");
int m=sc.nextInt();
int n1=0;
int n2=0;
int n3=0;
sc.close();
//數組實現
if(m<=2) {
n1=1;
}else {
int []x=new int[m];
x[0]=1;
x[1]=1;
for(int i=2;i<m;i++ ) {
x[i]=x[i-1]+x[i-2];
}
n1=x[m-1];
}
System.out.println("方法一:數組實現");
System.out.println("\t"+"第"+m+"月份共有"+n1+"對兔子");
System.out.println("--------------------------");
//相鄰變量實現
if(m<=2) {
n2=1;
}else {
int a=1;
int b=1;
int temp=0;
for(int i=0;i<m-2;i++) {
temp=a;
a=b;
b=temp+b;
}
n2=b;
}
System.out.println("方法二:相鄰變量實現");
System.out.println("\t"+"第"+m+"月份共有"+n2+"對兔子");
System.out.println("--------------------------");
//遞歸實現
n3=digui(m);
System.out.println("方法三:遞歸實現");
System.out.println("\t"+"第"+m+"月份共有"+n3+"對兔子");
}
private static int digui(int m) {
// TODO Auto-generated method stub
if(m<=2) {
return 1;
}else {
return digui(m-1)+digui(m-2);
}
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
輸出結果: