最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)論

汽车| 凯里市| 葫芦岛市| 芜湖市| 恩施市| 安阳县| 体育| 越西县| 鄂托克前旗| 西宁市| 牡丹江市| 铜梁县| 定西市| 莆田市| 温州市| 自贡市| 新建县| 郴州市| 乌拉特前旗| 池州市| 格尔木市| 安阳市| 临洮县| 湘阴县| 林口县| 墨江| 赤城县| 米脂县| 汶川县| 霍林郭勒市| 吉木萨尔县| 托里县| 汝阳县| 贵阳市| 岚皋县| 景泰县| 廉江市| 双峰县| 兴和县| 新巴尔虎右旗| 双鸭山市|