斐波那契数
- https://leetcode.cn/problems/fibonacci-number/
描述
-
斐波那契数 (通常用 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
算法实现
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大了的时候,性能会急剧下降
2 )方案 2文章来源:https://www.toymoban.com/news/detail-443247.html
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文章来源地址https://www.toymoban.com/news/detail-443247.html
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;
};
- 因为我们关注的是结果,所以,这里优化了空间复杂度
关于动态规划
- 动态规划是算法设计的一种方法
- 将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题
- 和分而治之的区别
- 将问题分解为一个是相互重叠的,一个是独立的子问题
- 最大区别就是:子问题是否独立
到了这里,关于数据结构与算法之动态规划: Leetcode 509. 斐波那契数 (Typescript版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!