题目
题号:509斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
例如:
0 1 1 2 3 5 8 13 21 斐波那契数列
0 1 2 3 4 5 6 7 8 下标
解法
Go
Go
package main
import "fmt"
// 使用递归,并用map保存已经求解过的值
func fib1(n int) int {
mp := make(map[int]int, n-2)
if n <= 1 {
return n
}
if _, ok := mp[n]; ok {
return mp[n]
} else {
rst := fib(n-1) + fib(n-2)
mp[n] = rst
return rst
}
}
// 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
func fib(n int) int {
if n <= 1 {
return n
}
rst := 0
pre := 1
prepre := 0
for i := 2; i <= n; i++ {
rst = pre + prepre
prepre = pre
pre = rst
}
return rst
}
func main() {
fmt.Println(fib(7))
}
Java
java
package org.example;
import java.util.HashMap;
import java.util.Map;
public class Fibonacci {
// 使用递归,并用map保存已经求解过的值
private Map<Integer, Integer> mp = new HashMap<>();
public int fib1(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
if (mp.get(n) != null) {
return mp.get(n);
} else {
int val = fib1(n - 1) + fib1(n - 2);
mp.put(n, val);
return val;
}
}
// 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
public int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int sum = 0, pre = 1, prepre = 0;
for (int i = 2; i <= n; i++) {
sum = pre + prepre;
prepre = pre;
pre = sum;
}
return sum;
}
}
Python
python
dic = {}
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
if n in dic:
return dic[n]
else:
val = fib(n - 1) + fib(n - 2)
dic[n] = val
return val
# 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
def fib1(n):
if n == 0:
return 0
if n == 1:
return 1
sum = 0
pre = 1
prepre = 0
for i in range(2, n + 1):
sum = pre + prepre
prepre = pre
pre = sum
return sum
if __name__ == '__main__':
print(fib(7))
print(fib1(7))