视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
js中递归函数的使用介绍_javascript技巧
2020-11-27 21:05:19 责编:小采
文档


下面我们就做一个10以内的阶乘试试看吧:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]


递归函数的调用就说这么多了

js递归函数调用自身时的保险方式。
来自js高级程序设计
一个典型阶乘递归函数:
代码如下:
function fact(num){
if (num<=1){
return 1;
}else{
return num*fact(num-1);
}
}

以下代码可导致出错:
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //出错

由于fact已经不是函数了,所以出错。
用arguments.callee可解决问题,这是一个指向正在执行的函数的指针。
新的函数为:
代码如下:
function fact(num){
if (num<=1){
return 1;
}else{
return num*arguments.callee(num-1); //此处更改了。
}
}
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //结果为24.

JS普通递归的改进

递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示:
代码如下:
function factorial(num)
{
if(num<=1)
{
return 1;
}
else
{
return num * factorial(num-1);
}
}

这是一个经典的阶乘函数。表面看来没有什么问题,但下面的代码却可能导致它出错。
var anotherFactorial = factorial;

anotherFactorial(4); //输出 24
factorial = null;
anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下测试
原因在于,我们定义的函数名,其实是指向函数的一个指针,此时定义了anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24
此时 factorial = null; 那么执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。
此时可以使用arguments.callee来替代函数定义中的 factorial,
函数的定义就变成了:
代码如下:
function factorial(num)
{
if(num<=1)
{
return 1;
}
else
{
return num * arguments.callee(num-1);
}
}

那么在使用上面的4行测试代码,最后一行测试代码也可以成功的输出24.
--------------------------------------
上述的内容摘自<>第2版 144页 7.1节

下载本文
显示全文
专题