JavaScript中的递归函数
首先让我们看看递归函数的概念:
函数function直接或间接调用其本身,则该函数称为递归函数。
看概念好像不好理解,OK,递归的思想像一个故事:
从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:…
在这个故事中反复调用自己的过程,便可以理解为递归。
将其使用代码编写出来:
function foo(){
foo();
}
foo();//调用名为foo的函数
看到这里,你可能要问了:这样的调用不断循环往复,永无止尽,有什么意义呢?是的,我们在实际应用中,往往只需要按照规律调用有限次数来达到目的,于是我们要给这样的递归添加一个终止条件,让函数在反复调用自己的过程里一旦满足了终止条件就停止继续调用。一个拥有明确终止条件的递归函数才能算是一个有实际意义的函数。
function sum( num ){
if( num === 1){
return 1; }//终止条件:当num值为1的时候返回1,跳出
return sum( num - 1 ) + num; //运算条件(函数体):num进行累加
}
var res = sum(5);//通过调用函数sum来计算5+4+3+2+1的值,并将结果赋给变量res
console.log( res );//打印变量res,查看调用结果
让我们来分析函数计算的具体实现过程:
1>我们通过sum(5)将5传入函数,不满足终止条件,得到sum(4)+5;
2>我们通过sum(4)将4传入函数,不满足终止条件,得到sum(3)+4;
3>我们通过sum(3)将3传入函数,不满足终止条件,得到sum(2)+3;
4>我们通过sum(2)将2传入函数,不满足终止条件,得到sum(1)+2;
5>我们通过sum(1)将1传入函数,终于满足终止条件得到1,不再需要调用了,我们就弯回去把具体的值加起来得到结果。
于是,通过五次调用,我们最终结果即为:1+2+3+4+5=15
这样的函数,为我们进行庞大的计算提供了方便,我们只需要给计算机设置一个停止条件,计算机便会为我们算出想要的结果。但是!!!
事实上递归的过程对处理器和内存非常不友好——处理器在计算的过程中一遍遍地调用函数,内存就需要一层层地建立函数栈,再一层层地退栈。这个过程非常消耗系统的性能,不易维护。更为可怕的是如果你的递归函数没有设置合适的终止条件,可能造成栈溢出,导致电脑正常影响运行。因此递归函数不建议使用,即使只是简单的递归函数,也要慎用。