leetcode每天一题:【斐波那契数】(简单)

414 阅读2分钟

这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

斐波那契数列是一个很特别的数列,它的第一项是0,第二项是1,从第三项开始,该项都等于前面两项相加的和。

比如第三项等于1,第四项等于2,第五项,等于3。

例子如下:

fn(0) = 0
fn(1) = 1
fn(2) = fn(1) + fn(0) = 1
fn(3) = fn(2) + fn(1) = 1 + 1 = 2
fn(4) = fn(3) + fn(2) = 2 + 1 = 3
依次类推...
fn(n) = ?

现在需要你通过一个函数,实现斐波那契数列,输入n,得到结果。

思路分析

第一种方法

因为斐波那契数列是从第三项开始(也就是n等于2)才有规律,所以我们对第一项和第二项做特殊处理。

因为它第三项是等于前面两项的和,所以我们可以利用三个变量,实现交换值的相加。

一个是先前值p(默认值是0),一个是当前值c(默认值是0),一个是结果值r(默认值是1)

把当前值赋值给先前值,把结果值赋值给当前值,最后把先前值和当前值相加等到结果值。这样子就能实现值的交换相加。这个是一个过程。

i是从2开始,使用for循环,重复上面的过程,直到i等于n.

最终输出r,就是斐波那契数。

代码如下:

/**
 * @param {number} n
 * @return {number}
 */
var fib = function (n) {
  if (n < 2) {
    return n;
  }
  let p = 0, c = 0, r = 1;
  for (let i = 2; i <= n; i++) {
    p = c;
    c = r;
    r = p + c;
  }
  return r
};

image.png

第二种方法

这个方法思路和上面是一致的,都是通过用三个变量,实现交换值的相加。

只不过换成了while循环,无需对第一项和第二项做特殊处理。然后先前值p的默认值是0,当前值c的默认值是1,结果值r的默认值是0。

当n减到0的时候会退出while循环,然后返回r,就是斐波那契数。

/**
 * @param {number} n
 * @return {number}
 */
var fib = function (n) {
  let p = 0, c = 1, r = 0
  while (n--) {
    p = c
    c = r
    r = p + c
  }
  return r
};

image.png