递归
首先什么是递归?
函数在解决某些问题的时候,需要调用其他的函数或者是其本身,那么对于调用其本身的情况,就可以叫做递归。
实现简单函数:x的n次方
第一种使用for 循环,也是初学者容易想到的方法;那么用递归怎么实现呢?
function pow(x,n){
if (n==1){
return x}else{
return x*pow(x,n-1)
}
alert(pow(2,3));
以上程序可以说明,pow函数不断的调用其本身,那么到n==1的时候,就会停止,也就达到了平方的目的
//简写如下
function pow(x,n){
return (n==1)?x:(x*pow(x,n-1))}
alert(pow(2,3));
相关概念:
递归深度:最大的嵌套调用次数被称为递归深度,递归深度受限于JavaScript引擎
执行上下文:执行上下文是一个内部数据结构,包含函数执行时的详细细节,当前控制流所在的位置,当前的变量等信息
执行上下文堆栈:由执行上下文数据结构形成的栈结构
最后一个n==1输出x之后,函数执行完毕,开始释放栈里面的内容,一次执行。
循环
我们刚刚也说过递归也是可以通过循环来实现的,那么到底是使用递归还是循环呢?
递归过程中使用到了执行上下文堆栈,是占用内存,但是循环过程中,一般只需要一个上下文,循环变体会更加有效
但是存在问题是,循环结构复杂,不容易理解和维护,所以一般情况下是使用递归较多