递归函数

6 篇文章 0 订阅
1 篇文章 0 订阅

递归函数

在项目中遇到了递归的使用,查阅资料对递归进行了学习,简单记录一下吧~

递归:通俗点讲就是自己调用自己,一直循环同样的一段代码

根据对递归的理解就会联想到一个问题,一直循环容易造成死循环,所以一定要 加限制条件 来结束循环

递归的常用使用场景

时间的递归,数的阶乘,只要重复嵌套使用同一段代码就可以使用递归

使用场景1: 斐波那契数列,形如 [1,1,2,3,5,8…]

function fib(n) {
  if (n < 3) {
   return 1;
  }
  return fib(n - 1) + fib(n - 2);
}
let k = fib(6);

这种递归方式需要重复计算,如果计算数值太大会造成浏览器内存占用太高,容易造成栈溢出。

使用尾递归就可以避免重复计算,每次返回的都是一个新的函数,不再重复调用上一个函数

尾递归:通俗来说就是返回结果中只有这个函数,不包含其他内容

//使用尾递归来实现斐波那契数列
function fib(n, v1 = 1, v2 = 1) {
  if (n == 1) {
    return v1;
  } else if (n == 2) {
    return v2;
  } else {
  return fib(n - 1, v2, v1 + v2);//只返回了这一个函数
  }
}
let g = fib(7)

使用场景2: 时间的递归

本次项目中用到的就是setTimeout的递归,实现在每500s内连续打印数字n,每过500s就加速一次,一共执行4个500s。直接上代码喽(只是自己的写法,仅展示递归的用法,有更优化的代码希望告之~)

let timer = ""; //延迟定时器
let timers = [];//用来存储定时器,也以此来设置递归的结束条件
let n = 0;
function toggle() {
  this.time(100)
}
toggle();
function time(s) { //递归函数
  if (timers.length == 4) {
    clearInterval(timers[timers.length - 1]);
    console.log(timers);
    return;
  }
  setTimeout(() => {
    clearInterval(timers[timers.length - 1]);
    timer = setInterval(this.print, s);
    timers.push(timer);
    this.time(s-20);
  }, 500);
}
function print() {
  console.log(n++);
}

嗯,就这样,遇到递归陆续更新。。。未完待续。

如有错误,欢迎指正吖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值