斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
——摘自百度百科
leetcode上的有一道爬楼梯的题就相当于是兔子数列
https://leetcode-cn.com/problems/climbing-stairs/
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
下面是三种js实现兔子数列的三种方法
最容易想到的就是递归,根据递推式F(n)=F(n-1)+F(n-2)
很容易写出。
const climbStairs = n => {
if (n <= 2) {
return n
}
return climbStairs(n - 1) + climbStairs(n - 2)
}
这也是比较容易想到的。
使用一个中间值tmp
保存前n-1项的和,通过循环求得第n个值
const usagi = n => {
if (n <= 2) {
return n
}
let a = 1, b = 2, tmp = 0
for (let i = 3; i <= n; i++) {
tmp = a + b
a = b
b = tmp
}
return tmp
}
使用数组循环相当于是对上面的循环的优化(?),省略了中间值tmp
直接将求得的和放入数组中。arr[n]就是求得的值。
需要注意的一点是,数组下标是0开始的。所以初始值取的是[1, 1]
const climbStairs = n => {
let arr = [1, 1]
for (let i = 2; i <= n;i++) {
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[n]
}