兔子数列(斐波拉契数列)javscript的三种写法

斐波那契数列(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)
}

很简单粗暴。
但是不能通过x 超出时间限制
兔子数列(斐波拉契数列)javscript的三种写法_第1张图片

循环(不使用数组)

这也是比较容易想到的。
使用一个中间值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]
}

你可能感兴趣的:(leetcode)