递归函数
在项目中遇到了递归的使用,查阅资料对递归进行了学习,简单记录一下吧~
递归:通俗点讲就是自己调用自己,一直循环同样的一段代码
根据对递归的理解就会联想到一个问题,一直循环容易造成死循环,所以一定要 加限制条件 来结束循环
递归的常用使用场景
时间的递归,数的阶乘,只要重复嵌套使用同一段代码就可以使用递归
使用场景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++);
}
嗯,就这样,遇到递归陆续更新。。。未完待续。
如有错误,欢迎指正吖