js递归函数用法实例介绍

发布时间:2019-08-31编辑:脚本学堂
本文介绍了js递归函数的用法,递归函数就是在函数体内调用本函数,使用递归函数一定要注意,处理不当就会进入死循环,有关js递归函数的例子,需要的朋友参考下。

什么是递归函数

递归函数就是在函数体内调用本函数,使用递归函数一定要注意,处理不当就会进入死循环。
递归函数只有在特定的情况下使用,比如阶乘问题。

例子,js递归函数实现一个10以内的阶乘。 
 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js递归函数示例_www.jb200.com</title>
<script type="text/javascript">
function f(num){
if(num<1){
return 1;
}else{
return f(num-1)*num;
}
}
</script>
</head>
<body>
<script type="text/javascript">
alert("10!的结果为:"+f(10));
</script>
</body>
</html>

以上是递归函数调用的例子,大家可以研究下。

下面介绍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。