斐波那契数列的概念
斐波那契数列(Fibonacci sequence),又称黄金分割]数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为兔子数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(*n *≥ 2,*n ∈ N)
斐波那契数列的三种解法
public class Fib {
private static Map<Integer, Integer> map = new HashMap<>();
/**
* 使用递归 由于重复计算效率是最慢的
*/
public static int fib(int n) {
if (n < 2) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
/**
* 使用递归加缓存 去除了重复计算 效率次之
*/
public static int fib2(int n) {
if (n < 2) {
return n;
}
if (map.containsKey(n)) {
return map.get(n);
}
int sum = fib2(n - 1) + fib(n - 2);
map.put(n, sum);
return sum;
}
/**
* 使用非递归 效率最高
*/
public static int fib3(int n) {
if (n < 2) {
return n;
}
int first = 0;
int second = 1;
int sum = 0;
while (n-- >= 2) {
sum = first + second;
first = second;
second = sum;
}
return second;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
if (fib(i) < 0) {
System.out.println(i);
break;
}
System.out.print(fib(i) + ",");
}
System.out.println();
System.out.println("fib1耗时" + (System.currentTimeMillis() - start) + " ms");
long start2 = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
if (fib2(i) < 0) {
System.out.println(i);
break;
}
System.out.print(fib2(i) + ",");
}
System.out.println();
System.out.println("fib2耗时" + (System.currentTimeMillis() - start2) + " ms");
long start3 = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
if (fib3(i) < 0) {
System.out.println(i);
break;
}
System.out.print(fib3(i) + ",");
}
System.out.println();
System.out.println("fib3耗时" + (System.currentTimeMillis() - start3) + " ms");
}
}
结果
总结
- 求斐波那契数列的值 使用递归的方法效率最低
- 求斐波那契数列的值 使用int类型时,在第47个数会发生溢出
LeetCode实战
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5
提示:
0 <= n <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.Map;
import java.util.HashMap;
class Solution {
private static Map<Integer, Integer> map = new HashMap<>();
public int fib(int n) {
if(n < 2){
return n;
}
if(map.containsKey(n)){
return map.get(n);
}
int sum = (fib(n - 1) + fib(n - 2)) % 1000000007;
map.put(n, sum);
return sum;
}
}