标题:斐波那契数列(不死神兔问题) Java代码三种方法实现
斐波那契数列又称 黄金分割 数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“ 兔子数列 ”:
- 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……以此类推
- 其规律是从第3个数开始,每个数都等于它前两个数的和。
Java代码实现如下:
方法一
编写递归算法程序:一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求数列的第40位数是多少。
/*编写递归算法程序:不死神兔 数的规则如下: 1、1、2、3、5、8、13、21、34...... 求数列的第40位数是多少。*/
public class TestRabbit01 {
//封装方法:递归计算方法 自己调用自己
//下面为方法,public static是成员方法修饰符 int是返回值类型是整数型变量 result是方法名 形参是n
public static int result(int n) {
if (n <= 0) {//当n不大于0时候 返回0 要求必须是大于0的月份
return 0;
} else if (n == 1 || n == 2) {//当月份是1和2时候都返回1
return 1;
} else {
return result(n - 1) + result(n - 2);//从第三个月开始,它的值等于它前面两个值相加的结果
}
}
//main方法测试
public static void main(String[] args) {
System.out.println(result(40));//打印结果102334155
}
}
方法二:循环方法实现
public class TestRabbit01 {
//封装方法:
//方法二 使用临时变量加for循环办法
public static void res(int n){
int a = 1;//存放前两个数的值
int b = 1;
int c = 0;//定义临时变量c
if(n<= 0){
System.out.println("请输入正整数月份...");
}else if(n == 1 || n == 2){
System.out.println("第"+n+"个月份的兔子数量是1个");
}else{
for (int i = 1; i <= n-2; i++) {
c = a + b;//从第三个数开始,是前两个数的和
a = b;//更新第一个数的值
b = c;//更新第二个数的值
}
System.out.println("第"+n+"个月份的兔子数量是"+c+"个");
}
}
//main方法测试
public static void main(String[] args) {
res(40);
}
}
方法三 数组+循环方法实现
public class TestRabbit01 {
//封装方法:
//方法三 使用数组加for循环
public static void res3(int n){
int[] arr = new int[n];//声明数组长度
arr[0] = arr[1] = 1;//动态初始化
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i-1]+arr[i-2];
}
System.out.println("第"+n+"个月份的兔子数量是"+arr[n-1]+"个");
}
//main方法测试
public static void main(String[] args) {
res3(3);//2
res3(40);//打印结果102334155
}
}
这道不死神兔题的实质就是斐波那契数列: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
现在从递归.临时变量.普通数组三个角度出发思考逻辑,当然还有其它的方法(比如动态数组ArrayList…),同一道题用各种不同的思路去思考解决,也是对知识综合运用的锻炼吧。
希望对大家有帮助,也欢迎大家多多交流,谢谢