每日前端手写题--day9

以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?

第jiu天要刷的手写题如下:

  1. 实现斐波那契数列
  2. 使用定时器实现setInterval函数功能
  3. 间隔一秒打印1-5

下面是我自己写的答案:

1. 间隔一秒打印1-5

1.1 递归版本

js 复制代码
function fi(n) {
  if(n===0 || n===1) return 1;
  return fi(n-1)+fi(n-2);
}

1.2 缓存版本

js 复制代码
const cache = {
    0: 1,
    1: 1,
}

function fi(n) {
    if (cache[n]) return cache[n];
    cache[n] = fi(n - 1) + fi(n - 2);
    return cache[n];
}

1.3 使用闭包

js 复制代码
const fi = (function (n) {
    const cache = {
        0: 1,
        1: 1,
    }
    return function fi(n) {
        if (cache[n]) return cache[n];
        cache[n] = fi(n - 1) + fi(n - 2);
        return cache[n];
    }
})()

1.4 使用迭代代替递归

js 复制代码
const cache = [1, 1];

function fi(n) {
    for(let i = 2; i<=n; i++){
       cache[i] = cache[i-1]+cache[i-2];
    }
    return cache[n];
}

1.5迭代和缓存

js 复制代码
const cache = [1, 1];

function fi(n) {
    if(cache[n]) return cache[n];
    const startIndex = cache.length;
    for(let i = startIndex; i<=n; i++){
       cache[i] = cache[i-1]+cache[i-2];
    }
    return cache[n];
}

2. 使用定时器实现间隔器

本质上是封装了业务的函数和封装了定时器的函数之间的相互调用,outer函数的返回值需要提供使之停下来的方法。

js 复制代码
function myInterval (exec, gap) {
  let timer = null;
  // 封装业务的函数
  const _exec = () => {
    exec();
    _loop();
  }
  // 封装定时器的函数
  function _loop(){
    timer = setTimeout(
      _exec, gap
    )
  }
  // 开始执行
  _loop();
  // 返回使循环停止的方法
  return function _stop () {
    clearTimeout(timer);
  }
}

const stop = myInterval(()=>console.log(+new Date()), 1000);

3. 间隔一秒打印1-5

此问题需要拆分一下,很容易下意识的认为先打印1,隔一秒之后打印2,再隔一秒打印3... 但是程序执行是需要时间的,正确的做法应该是,第一秒打印1,第二秒打印2...

js 复制代码
function print15(){
  const _start = +new Date();
  for(let i = 1; i <= 5; i++){
    setTimeout(
      ()=>{
        console.log(i);
        console.log(+new Date()-_start);
      }, i*1000
    )
  }
}
相关推荐
ct97826 分钟前
vue2 + vue3差异点
前端·javascript·vue.js
小徐_233336 分钟前
程序员每天盯屏 10 小时,我开始认真研究“专业编程屏”这件事
前端
悟空瞎说1 小时前
Git 协作工作流详解:从个人单打独斗到规模化团队协同
前端·git
颜进强1 小时前
20-Spec-Kit Tasks 是怎么把技术方案拆成可执行任务的?
前端·后端·ai编程
程序员鱼皮1 小时前
Cursor 零基础实战教程,夯爆了!带你速通 6 大核心能力
前端·后端·ai编程
颜进强1 小时前
14-Spec-Kit、SDD 和 OpenSpec 到底有什么区别?其实核心思想都一样:先写清楚,再让 AI 干活
前端·后端·ai编程
颜进强1 小时前
16-Spec-Kit 是什么?先从整体流程机制讲起
前端·后端·ai编程
悟空瞎说1 小时前
QML 集成 WebView 开发桌面内嵌浏览器实战
前端
Delicate1 小时前
揭开JS深拷贝的底裤:从递归到循环引用的终极解法
javascript
前端与小赵1 小时前
快速生成安卓证书并打包生成安卓apk(保姆教程)
android·前端