递归
1.什么叫做递归
答:当前函数自己调用自己,要理解递归,废话不多说,直接看一道面试题
需求:求1~100之间,不能被3整除的整数的和
function sum(n) {
if(n==0){ //如果传进来的值是0,说明累加到头了。无需继续累加,返回为0即可。没有再次执行条件,停止执行了。
return 0;
}
if(n%3==0){ //如果传进来的值能被3整除,我们不需要累加,直接让值减一,即sum(n-1),因为有sum(n-1)这个条件继续传入到sum函数,继续执行
return sum(n-1);
}
return n+sum(n-1); //用当前值n和下一个值sum(n-1)进行累加,有再次执行的条件,再次传入sum函数,继续执行
}
var total = sum(100); //执行函数,传入实参,把值赋值给total;
console.log(total);
结果为 3367;此结果正确
- 说明:此面试题我是用递归做的,一个函数自己调用自己。其实面试官也是想要这种方法(用if或者while等判断也可),相信大家看这个实例,应该对递归有了大致了解吧。
2.定时器和递归
我们先用setInerval写一个循环输出的例子
var count = 0;
var timer = null;
clearInterval(timer);
timer = setInterval(function () {
count++;
console.log(count);
if(count==10){
clearInterval(timer);
}
},1000);
结果为 1,2,3,4,5,6,7,8,9,10
用setTimeout实现轮询功能(仿setInterval)
var count = 0;
var timer = null;
function move() {
count++;
console.log(count);
if(count==10){return;} //每一次执行move方法,都会创建一个新的定时器,导致很多定时器累积,占内存,所以在新创建定时器之前,我们应该清楚定时器;
clearTimeout(timer);
timer = setTimeout(move,1000);
}
move();
结果为 1,2,3,4,5,6,7,8,9,10
对于前端来说,我们相对于后台使用递归并没有那么soEasy,但是这种重要的思想,我们还是要去尝试的。