haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……

Home Page:http://www.h-camel.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[js] 第148天 请使用原生的js实现斐波那契数列

haizhilin2013 opened this issue · comments

第148天 请使用原生的js实现斐波那契数列

let Fibonacci = num => {
    if (!Fibonacci.sequence) Fibonacci.sequence = [1, 1]
    if (Fibonacci.sequence[num] !== undefined) return Fibonacci.sequence.slice(0, num)
    for (var i = Fibonacci.sequence.length; i < num + 1; i++) {
        Fibonacci.sequence[i] = Fibonacci.sequence[i - 1] + Fibonacci.sequence[i - 2]
    }
    return Fibonacci.sequence.slice(0, num)
}

分享哈

function Fibonacci (n) {
  let arr = [1, 1]
  for (let i = 2; i < n + 1; i++) {
    arr[i] = arr[i - 1] + arr[i - 2]
  }
  return arr
 //return arr[n]
}
// 使用同步缓存
function useCache(fn) {
  var cache = {};
  return function(){
    var key = Array.prototype.join.call(arguments);
    if (key in cache) return cache[key];
    else return cache[key] = fn.apply(fn, arguments);
  }
}
function fibonacci (n) {
  if ( n <= 1 ) return 1;
  return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci = useCache(fibonacci);
// 使用同步缓存
function useCache(fn) {
  var cache = {};
  return function(){
    var key = Array.prototype.join.call(arguments);
    if (key in cache) return cache[key];
    else return cache[key] = fn.apply(fn, arguments);
  }
}
function fibonacci (n) {
  if ( n <= 1 ) return 1;
  return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci = useCache(fibonacci);

恁这不对吧,输出8是数列

const fib = (limit = 10, arr = [1, 1]) => {
  // 使用循环
  // if (limit < 3) {
  //   return arr;
  // }

  // const result = arr;
  // while (result.length < limit) {
  //   const len = result.length;
  //   result.push(result[len - 1] + result[len - 2]);
  // }
  // return result;

  // 使用递归
  if (arr.length < limit) {
    const len = arr.length;
    return fib(limit, [...arr, arr[len - 1] + arr[len - 2]]);
  } else {
    return arr;
  }
};

console.log(fib());
console.log(fib(9));
const fib=(n,sum1=1,sum2=1)=>{
if(n<1) return sum2
return fib(n-1,sum2,sum1+sum2)
}

ES6尾递归优化,严格模式有效

function fibonacci(n) {
  const fibSequence = [1];

  let currentValue = 1;
  let previousValue = 0;

  if (n === 1) {
    return fibSequence;
  }

  let iterationsCounter = n - 1;

  while (iterationsCounter) {
    currentValue += previousValue;
    previousValue = currentValue - previousValue;

    fibSequence.push(currentValue);

    iterationsCounter -= 1;
  }

  return fibSequence;

#1180 (comment)
对的吧,举个反例贴一下吧,嘤嘤嘤

function Fibonacci (n) {
  let arr = [1, 1]
  for (let i = 2; i < n + 1; i++) {
    arr[i] = arr[i - 1] + arr[i - 2]
  }
  return arr
 //return arr[n]
}