递归
回调函数
被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。
扩展开来说,如果一个函数A虽然不传入函数B,但函数B每次执行,都调用函数A,那么A其实也算是函数B的回调函数,只不过函数A是函数B的隐式回调函数。
递归与回调函数的关系
可以认为,递归就是一个隐式回调函数,它隐式调用了自身。
一般的递归内部,一般return出去的值,就包含了调用自身这个隐式回调函数的返回值。
递归的原则
-
每一次return出去的fn函数的入参值必定是一个与本轮递归不一样的数值。
- 为了便于理解,不熟悉之前最好是重新用一个变量把下次递归的实参存起来。
例子
原版的:
function fn(num) {
if (num > 100) {
return 0;
}
if (num % 2 === 0 && num % 3 === 0) {
return num + fn(num+1)
}
return fn(num+1)
}
var res = fn(1);
console.log(res);
实际上中间有一步,就是每一次递归的入参都和之前的不一样。
每一次return出去的fn函数的入参值必定是一个与本轮递归不一样的数值。
为了便于理解,不熟悉之前最好是重新用一个变量把下次递归的实参存起来。
把实参用变量next存起来的版本,就会发现本轮函数里的入参值为num,但下一轮次的递归的入参就是next。而next的值是当前的num+1:
function fn(num) {
if (num > 100) {
return 0;
}
var next = num+1;
if (num % 2 === 0 && num % 3 === 0) {
return num + fn(next)
}
return fn(next)
}
var res = fn(1);
console.log(res);