欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js中遞歸函數(shù)的使用介紹

 更新時(shí)間:2012年10月25日 01:15:24   作者:  
所謂的遞歸函數(shù)就是在函數(shù)體內(nèi)調(diào)用本函數(shù)。使用遞歸函數(shù)一定要注意,處理不當(dāng)就會(huì)進(jìn)入死循環(huán)。遞歸函數(shù)只有在特定的情況下使用 ,比如階乘問(wèn)題
下面我們就做一個(gè)10以內(nèi)的階乘試試看吧:

[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
 


遞歸函數(shù)的調(diào)用就說(shuō)這么多了

js遞歸函數(shù)調(diào)用自身時(shí)的保險(xiǎn)方式。
來(lái)自js高級(jí)程序設(shè)計(jì)
一個(gè)典型階乘遞歸函數(shù):
復(fù)制代碼 代碼如下:

function fact(num){
if (num<=1){
return 1;
}else{
return num*fact(num-1);
}
}

以下代碼可導(dǎo)致出錯(cuò):
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //出錯(cuò)

由于fact已經(jīng)不是函數(shù)了,所以出錯(cuò)。
用arguments.callee可解決問(wèn)題,這是一個(gè)指向正在執(zhí)行的函數(shù)的指針。
新的函數(shù)為:
復(fù)制代碼 代碼如下:

function fact(num){
if (num<=1){
return 1;
}else{
return num*arguments.callee(num-1); //此處更改了。
}
}
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //結(jié)果為24.


JS普通遞歸的改進(jìn)

遞歸函數(shù)是在一個(gè)函數(shù)通過(guò)名字調(diào)用自身的情況下構(gòu)成的,如下所示:
復(fù)制代碼 代碼如下:

function factorial(num)
{
if(num<=1)
{
return 1;
}
else
{
return num * factorial(num-1);
}
}

這是一個(gè)經(jīng)典的階乘函數(shù)。表面看來(lái)沒(méi)有什么問(wèn)題,但下面的代碼卻可能導(dǎo)致它出錯(cuò)。
var anotherFactorial = factorial;

anotherFactorial(4); //輸出 24
factorial = null;
anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下測(cè)試
原因在于,我們定義的函數(shù)名,其實(shí)是指向函數(shù)的一個(gè)指針,此時(shí)定義了anotherFactorial 也指向了那個(gè)函數(shù),所以調(diào)用anotherFactorial (4)可以成功的輸出24
此時(shí) factorial = null; 那么執(zhí)行定義函數(shù)的引用就剩下了anotherFactorial,那么在調(diào)用anotherFactorial(4)就會(huì)顯示以上的錯(cuò)誤的信息。
此時(shí)可以使用arguments.callee來(lái)替代函數(shù)定義中的 factorial,
函數(shù)的定義就變成了:
復(fù)制代碼 代碼如下:

function factorial(num)
{
if(num<=1)
{
return 1;
}
else
{
return num * arguments.callee(num-1);
}
}

那么在使用上面的4行測(cè)試代碼,最后一行測(cè)試代碼也可以成功的輸出24.
--------------------------------------
上述的內(nèi)容摘自<<JavaScript高級(jí)程序設(shè)計(jì)>>第2版 144頁(yè) 7.1節(jié)

相關(guān)文章

最新評(píng)論