每日前端手写题--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
    )
  }
}
相关推荐
shawxlee8 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
用户059540174469 小时前
把记忆存储的回归测试从手工换成 Playwright + GitHub Actions,线上缺陷降低 80%
前端·css
触底反弹9 小时前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
kyriewen9 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
颜酱9 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
wdfk_prog9 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
郝亚军10 小时前
如何安装webstorm、Node.js和vue CLI
前端·javascript·vue.js
IT_陈寒10 小时前
React的useEffect依赖项把我坑惨了
前端·人工智能·后端
东方小月11 小时前
从零开发一个Coding Agent:monorepo项目搭建
前端·后端·node.js
葬送的代码人生11 小时前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构