本文参考了AceCandy的【Java算法】斐波那契数列全算法+优化+代码(从入门到发疯)这篇文章。
原文:https://blog.csdn.net/acecandy/article/details/83864763
为什么写这篇文章
蓝桥杯考试凉凉。
原题
斐波那契数列问题的扩展,第四项开始每一项是前三项的和,求第20190324项的后四位。
解法
我使用的解法
最简单的递归,根本不可能算出来。
学习后的解法
public class fiboTrue {
public static int fibo1(int num){//我使用的递归输出第num位的数字,时间复杂度为:O(2^(N/2))<=T(N)<=O(2^N)。num大于30就很慢
if(num == 1 || num == 2 || num ==3)
return 1;
return fibo1(num - 1) + fibo1(num - 2) + fibo1(num - 3);
}
public static long fibo2(int num){//正确递归for循环输出第num位的数字,时间复杂度为O(n)。
long num1 = 1;
long num2 = 1;
long num3 = 1;
long num4 = 0;
if(num == 1 || num == 2 || num ==3)
return 1;
for(int i = 0; i <= num - 4; i++) {
num4 = num1 + num2 + num3;
num1 = num2;
num2 = num3;
num3 = num4;
}
return num4;
}
public static void main(String[] args) {
System.out.println(fibo2(20190324));
}
}
总结
对递归的掌握太浅,啥都不会。