编写程序:
一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求数列的第40位数是多少。
一般遇到直接就考虑递归了,但是递归的时间复杂度确实大,位数较大时很难得出结果,因此考虑非递归方法实现;
直接贴出代码:
public class FibonacciSequence {
public static void main(String[] args) {
int indexNum = 40;
long theNum;
//theNum = fibonacciSequence(indexNum);//递归
//theNum = fibonacciSequenceArray(indexNum);//数组
theNum = fibonacciSequenceNum(indexNum);//数
System.out.println("斐波那契数列第" + indexNum + "个数为:" + theNum);
}
//递归方法实现 时间复杂度O(2^n) 使用递归时,获取较大位数的值,基本跑不动
private static long fibonacciSequence(int indexNum) {
if (indexNum == 1 || indexNum == 2) {
return 1;
} else {
return fibonacciSequence(indexNum - 1) + fibonacciSequence(indexNum - 2);
}
}
//数组实现 时间复杂度O(n),空间复杂度O(n)
private static long fibonacciSequenceArray(int indexNum) {
long[] fsa = new long[indexNum];//求第indexNum个数,则由此定义数组大小
for (int i = 0; i < indexNum; i++) {//注意循环次数
if (i == 0 || i == 1) {
fsa[i] = 1L;//第一个和第二个数都为1
} else {
fsa[i] = fsa[i - 1] + fsa[i - 2];//从第三个数开始,每个数都是前两个数的和
}
}
return fsa[indexNum - 1];//数组中最后一个数即为所求
}
//直接用三个数实现 时间复杂度O(n) 空间复杂度O(1)
private static long fibonacciSequenceNum(int indexNum) {
long firstNum = 1L;//第一个数
long secondNum = 1L;//第二个数
long thirdNum = 0L;
for (int i = 3; i <= indexNum; i++) {
thirdNum = firstNum + secondNum;
firstNum = secondNum;//重新为前面两个数赋值
secondNum = thirdNum;
}
return thirdNum;
}
}
以上为本人学习java基础练手所写,若有错误,还请指出。