浅谈-js递归函数
?
所謂的遞歸函數(shù)就是在函數(shù)體內(nèi)調(diào)用本函數(shù)。使用遞歸函數(shù)一定要注意,處理不當(dāng)就會進(jìn)入死循環(huán)。遞歸函數(shù)只有在特定的情況下使用 ,比如階乘問題
下面我們就做一個10以內(nèi)的階乘試試看吧:?
?
? [Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
?
?
?
遞歸函數(shù)的調(diào)用就說這么多了?
?
js遞歸函數(shù)調(diào)用自身時的保險方式。?
來自js高級程序設(shè)計?
一個典型階乘遞歸函數(shù):?
?
function fact(num){?
if (num<=1){?
return 1;?
}else{?
return num*fact(num-1);?
}?
}?
?
以下代碼可導(dǎo)致出錯:?
var anotherFact = fact;?
fact = null;?
alert(antherFact(4)); //出錯?
?
由于fact已經(jīng)不是函數(shù)了,所以出錯。?
用arguments.callee可解決問題,這是一個指向正在執(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ù)是在一個函數(shù)通過名字調(diào)用自身的情況下構(gòu)成的,如下所示:?
?
function factorial(num)?
{?
if(num<=1)?
{?
return 1;?
}?
else?
{?
return num * factorial(num-1);?
}?
}?
?
這是一個經(jīng)典的階乘函數(shù)。表面看來沒有什么問題,但下面的代碼卻可能導(dǎo)致它出錯。?
var anotherFactorial = factorial;?
?
anotherFactorial(4); //輸出 24?
factorial = null;?
anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下測試
原因在于,我們定義的函數(shù)名,其實是指向函數(shù)的一個指針,此時定義了anotherFactorial 也指向了那個函數(shù),所以調(diào)用anotherFactorial (4)可以成功的輸出24?
此時 factorial = null; 那么執(zhí)行定義函數(shù)的引用就剩下了anotherFactorial,那么在調(diào)用anotherFactorial(4)就會顯示以上的錯誤的信息。?
此時可以使用arguments.callee來替代函數(shù)定義中的 factorial,?
函數(shù)的定義就變成了:?
?
function factorial(num)?
{?
if(num<=1)?
{?
return 1;?
}?
else?
{?
return num * arguments.callee(num-1);?
}?
}?
?
那么在使用上面的4行測試代碼,最后一行測試代碼也可以成功的輸出24.?
--------------------------------------?
上述的內(nèi)容摘自<<JavaScript高級程序設(shè)計>>第2版 144頁 7.1節(jié)
轉(zhuǎn)載于:https://www.cnblogs.com/HanJie0824/p/5867031.html
總結(jié)
- 上一篇: 《图解机器学习-杉山将著》读书笔记---
- 下一篇: java 11-7String类里的方法