每日前端手写题--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
    )
  }
}
相关推荐
万少3 小时前
用腻了 WorkBuddy 的默认界面?这个开源小工具给它换上了毛玻璃
前端·javascript·后端
To_OC4 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
触底反弹5 小时前
🔥 前端也能玩转 AI 流式输出!从二进制流到打字机效果,一篇讲透
javascript·人工智能·node.js
胡萝卜术5 小时前
深度重构:Agent Skills——从 Prompt 工程到能力工程
javascript·架构·github
海上彼尚6 小时前
Nodejs也能写Agent - 16.LangGraph篇 - 条件分支与循环
前端·后端·langchain·node.js
To_OC7 小时前
从 “卡死半天” 到 “打字机效果”:大模型流式输出前端实现全记录
前端·javascript·llm
rockey6277 小时前
基于AScript的JavaScript脚本语言发布啦
javascript·c#·.net·js·script
SoaringHeart8 小时前
Flutter最佳实践:键盘辅助视图输入框天添加图片附件
前端·flutter
kyriewen8 小时前
我看完这篇安全论文——AI推荐的npm包,92%是编出来的
前端·javascript·ai编程
心中有国也有家9 小时前
AtomGit Flutter 鸿蒙客户端:Canvas 绘制进阶-路径、渐变与混合模式
android·javascript·flutter·华为·harmonyos