問題一:求n的階乘:n! = n(n-1)!;
n! = n(n-1)(n-2)....32*1;
方案一:便利
public static void main(String[] args) {
// System.out.println(1 * 2 * 3 * 4 * 5);
int jc = 1;
for (int x = 1; x <= 5; x++) {
jc *= x;
}
System.out.println(jc);
}
方案二:遞歸
public static void main(String[] args) {
System.out.println(jc(5));
}
/*
* 遞歸要寫一個方法出來。
* 我假設我有一個方法jc(n)表示n的階乘。
* 請問,你如何表示n-1的階乘。jc(n-1)。
* 規律:n! = n*(n-1)!
* 出口條件是什么:n=1的時候,結果是1。
*/
public static int jc(int n){
if(n==1){
return 1;
}else {
return n*jc(n-1);
}
}
問題二:
* 有一對兔子,從出生后第3個月起每個月都生一對兔子,
* 小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,
* 問第20個月的兔子對數為多少?
方案一(數組):
/*
* 從第三個月開始,每個月是前兩個月之和。第一月和第二月是已知道的,并且都是1。
* 斐波那契數列。
*
* 兔子對數
* 第一月 1
* 第二月 1
* 第三月 2
* 第四月 3
* 第五月 5
* 第六月 8
* ...
*
*/
public static void main(String[] args) {
// 數組
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
/*
arr[2] = arr[0] + arr[1];
arr[3] = arr[1] + arr[2];
arr[4] = arr[2] + arr[3];
...
*/
for(int x=2; x<arr.length; x++){
arr[x] = arr[x-2] + arr[x-1];
}
System.out.println(arr[19]);
//變量的交換
int a = 1;
int b = 1;
for(int x=0; x<18; x++){
int temp = a;
a = b;
b = temp + b;
}
System.out.println(b);
}
方案二:(變量的交換)
/*
* 假設相鄰的兩個月份被我定義為變量a,b
* 第一個相鄰:a=1,b=1
* 第二個相鄰:a=1,b=2
* 第三個相鄰:a=2,b=3
* 第四個相鄰:a=3,b=5
* 第五個相鄰:a=5,b=8
*/
public static void main(String[] args) {
//變量的交換
int a = 1;
int b = 1;
for(int x=0; x<18; x++){
int temp = a;
a = b;
b = temp + b;
}
System.out.println(b);
}
方案三:(遞歸)
/*
* 1,1,2,3,5,8...
*
* 規律:從第三項開始,每一項是前兩項之和。 出口:第一項和第二項是已知的。
*
* 假設我有一個方法:f(n)表示第n項。 請問n-1項和n-2項怎么表示呢? f(n-1),f(n-2)
*/
public static void main(String[] args) {
System.out.println(f(20));
}
public static int f(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return f(n - 1) + f(n - 2);
}
}