题目:https://leetcode-cn.com/problems/fibonacci-number/
代码:
方法一:递归
class Solution { public int fib(int N) { if(N<=1){ return N; } return fib(N-1)+fib(N-2); } }
递归是最简单的一个解法,但是性能上不行,因为会有很多重复的计算,比如计算fib(5),就要重复的调用5次fib(1),性能严重浪费。
方法二:循环
class Solution { public int fib(int N) { if(N<=1){ return N; } int[] num = new int[N + 1]; num[0] = 0; num[1] = 1; for (int i=2; i <= N; i++) { num[i] = num[i - 1] + num[i - 2]; } return num[N]; } }
使用一个数组存储数据,第i个数的值就等于第i-1和第i-2的值之和。相比第一种递归的方法减少了大量重复的计算。
方法三:带缓存的循环
class Solution { private static int[] cache = new int[]{0, 1}; public int fib(int N) { int i = cache.length; if (N >= i) { cache = Arrays.copyOf(cache, N + 1); for (; i <= N; i++) { cache[i] = cache[i - 1] + cache[i - 2]; } } return cache[N]; } }
方法三是方法二的优化版本,通过将数组缓存起来的方式,实现多次调用fib函数时性能上的提升,避免每一次都去计算。但是此方法会有并发的线程安全问题(这里暂不考虑,考虑的话方法加锁即可)
方法四:数学解法
采用各种数学公式直接计算值,具体参考百度。