/*
* 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
*
* 分析:
* 第1月 1
* 第2月 1
* 第3月 2
* 第4月 3
* 第5月 5
* ...
*
* 数据规律:1,1,2,3,5...(斐波纳契数列)
*
* 找规律:
* 从第三个数开始,每一个数是前两个数之和。
* 说明第一个和第二个是已知的。
*
* 面试题:求阶乘,求斐波纳契数列的第二十项。
*
* 类似的题目:
* 1/2,2/3,3/5,5/8,8/13...
* 2/1,3/2,5/3,8/5...
*
*/
public class DiGuiDemo {
public static void main(String[] args) {
System.out.println(fib(20));
// 用数组做
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for (int x = 2; x < 20; x++) {
// arr[2] = arr[1] + arr[0] = 2
// arr[3] = arr[2] + arr[1] = 3;
arr[x] = arr[x - 1] + arr[x - 2];
}
System.out.println(arr[19]);
//用变量的变化
/*
* 定义两个变量a,b从头开始
* a=1,b=1
*
* 1到1对应的a,b是 1,1
* 2到3对应的a,b是 1,2
* 3到4对应的a,b是 2,3
* 5到4对应的a,b是 3,5
*
* 下一对的 数据a,b和上一对的数据a,b存在这样的关系:
* a = 以前b
* b = 以前的a+以前的b
*/
int a = 1;
int b = 1;
for(int x=0; x<18; x++){
//临时变量存储以前的a
int temp = a;
a = b;
b = temp+b;
}
System.out.println(b);
}
/*
* 我假设f(n)表示求第n个月的兔子对数。 请问:第n-1个月的兔子对数 f(n-1) 第n-1个月的兔子对数 f(n-2)
*/
public static int fib(int n) {
// if(n==1){
// return 1;
// }
// else if(n==2){
// return 1;
// }
if (n == 1 || n == 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
}
斐波纳契数列
最新推荐文章于 2023-06-18 17:21:00 发布