Java来实现斐波那契数列
斐波那契数列是在面试过程中看到的,当时想就先写一个算法实现,觉得递归不错,就用递归来写出来,回来细想不对,当N值大就会递归次数太多,效率很慢。
##递归代码:
int methodNumber=1;
public static int setReNum(int number){
System.out.println("方法调用次数:"+methodNumber);
methodNumber++;
if(number>0){
if(number <2){
return number;
}
return setReNum(number-1)+setReNum(number-2);
}
return 0;
}
当数值很小,计算没毛病,但值越大递归次数就越多,所以不推荐这种写法。后来仔细想了下,值3以后是前两次相加,那可不可以通过循环,存中间值来实现结果
##循环代码1后面值来着前面两个
public static int getFibonacciSequenceByNumber(int number){
if(number<3)return new BigDecimal(number);
int firstNumber = 1;
int secondNumber = 1;
int middleNumber; // 设一个中间变量
for(int i = 3;i<= number;i++){
middleNumber = secondNumber;
secondNumber= firstNumber+secondNumber;
firstNumber = middleNumber; //对a.b值进行互换
}
return secondNumber;
}
循环代码2:last一直基于最新值减last(旧值),赋值新值,进行循环。
public static BigDecimal getFibonacciSequenceByNumber2(int number){
BigDecimal now = new BigDecimal("1");
BigDecimal last = new BigDecimal("0");
for(int i =1;i<=number;i++){
System.out.println("第"+i+"个月的兔子数为:"+now+"对");
now = now.add(last);
last = now.subtract(last);
}
return last;
}
注:值越大,使用int来计算,得到结果会有精度问题,所以最后一个方法使用BigDecimal进行计算的。
大家有更好的代码实践欢迎可以留言。