斐波那契数
描述
- 斐波那契数 (通常用 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 <= n <= 30
Typescript 版算法实现
1 )方案 1
function fib(n: number): number {
if (n === 0) return 0
if (n === 1) return 1
return fib(n-1) + fib(n-2)
}
- 这种是递归, 性能非常不好, 当n大了的时候,性能会急剧下降
- 下面是添加了记忆化搜索的优化版
const memo = {} function fib(n: number): number { // 基本情况 if (n <= 1) return n; // 检查 memo 中是否已经存储了结果 if (memo[n] !== undefined) return memo[n]; // 递归计算并存储结果 memo[n] = fib(n - 1) + fib(n - 2); return memo[n]; }
2 )方案 2
function fib(n: number): number {
let fibs: number[] = [0,1];
for(let i: number = 2; i <= n; i++){
fibs[i] = fibs[i-1] + fibs[i-2];
}
return fibs[n];
};
- 思路:
- 0, 1, 后面任何一个数字,就是其前两个的和
- 定义子问题:F(n) = F(n-1) + F(n-2)
- 反复执行:从2循环到n,执行上述公式
3 )方案 3
function fib(n: number): number {
if (n === 0) return 0
if (n === 1) return 1
let start:number = 0
let end:number = 1
for(let i: number = 2; i <= n; i++) {
const endTmp:number = end
end += start
start = endTmp
}
return end;
};
- 因为我们关注的是结果,所以,这里优化了空间复杂度
Python3 版算法实现
1 )方案 1
class Solution:
def fib(self, n: int) -> int:
if n == 0: return 0
if n == 1: return 1
return self.fib(n-1) + self.fib(n-2)
2 )方案 2
class Solution:
def fib(self, n: int) -> int:
fibs = [0, 1]
for i in range(2, n+1):
fibs.append(fibs[-2] + fibs[-1])
return fibs[n]
3 )方案 3
class Solution:
def fib(self, n: int) -> int:
if n == 0: return 0
if n == 1: return 1
start = 0
end = 1
for i in range(2, n + 1):
tmp = end
end += start
start = tmp
return end
Golang 版算法实现
1 )方案 1
func fib(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return fib(n-2) + fib(n-1)
}
2 )方案 2
func fib(n int) int {
fibs := []int{0, 1}
for i:= 2; i <= n; i++ {
// 扩展切片以容纳新计算的斐波那契数
fibs = append(fibs, fibs[i-2] + fibs[i-1])
}
return fibs[n]
}
3 )方案 3
func fib(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
start := 0
end := 1
for i:= 2; i <= n; i++ {
tmp := end
end += start
start = tmp
}
return end
}
关于动态规划
- 动态规划是算法设计的一种方法
- 将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题
- 和分而治之的区别
- 将问题分解为一个是相互重叠的,一个是独立的子问题
- 最大区别就是:子问题是否独立
460



被折叠的 条评论
为什么被折叠?



