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ù):
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ù)為:
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)成的,如下所示:
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ù)的定義就變成了:
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é)
[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é)
您可能感興趣的文章:
- JavaScript的遞歸之遞歸與循環(huán)示例介紹
- JS遍歷數(shù)組和對(duì)象的區(qū)別及遞歸遍歷對(duì)象、數(shù)組、屬性的方法詳解
- JS中遞歸函數(shù)
- javascript如何用遞歸寫一個(gè)簡(jiǎn)單的樹(shù)形結(jié)構(gòu)示例
- JS遞歸遍歷對(duì)象獲得Value值方法技巧
- js 遞歸json樹(shù)實(shí)現(xiàn)根據(jù)子id查父id的方法分析
- 深入Javascript函數(shù)、遞歸與閉包(執(zhí)行環(huán)境、變量對(duì)象與作用域鏈)使用詳解
- JavaScript采用遞歸算法計(jì)算階乘實(shí)例
- 關(guān)于JavaScript遞歸經(jīng)典案例題詳析
相關(guān)文章
Javascript實(shí)現(xiàn)登錄記住用戶名和密碼功能
本文主要介紹了Javascript實(shí)現(xiàn)登錄記住用戶名和密碼功能的代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03基于JavaScript實(shí)現(xiàn)帶縮略圖的輪播效果
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)帶縮略圖的輪播效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01JavaScript 函數(shù)的執(zhí)行過(guò)程
下面小編就為大家?guī)?lái)一篇JavaScript 函數(shù)的執(zhí)行過(guò)程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05gojs實(shí)現(xiàn)螞蟻線動(dòng)畫效果
這篇文章介紹了gojs實(shí)現(xiàn)螞蟻線動(dòng)畫效果的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01js實(shí)現(xiàn)短信發(fā)送倒計(jì)時(shí)功能(正則驗(yàn)證)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)短信發(fā)送倒計(jì)時(shí)功能,包含正則驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02