溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Javascript 實現(xiàn)匿名遞歸的實例代碼

發(fā)布時間:2020-09-06 03:01:05 來源:腳本之家 閱讀:161 作者:肖國棟 欄目:web開發(fā)

遞歸是一種常見的編程技巧,實名遞歸相信大家都不陌生,但如果想要實現(xiàn)匿名遞歸呢?比如想要返回一個匿名遞歸函數(shù),又或者是定義一個匿名遞歸函數(shù)并直接調(diào)用它,該怎樣去做呢?本文將來探討一下它的實現(xiàn)。

實名遞歸

我們還是先從實名遞歸說起吧,還是用那個最簡單的求階乘的例子:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * fact(n - 1);
 }
}
console.log(fact(5));

遞歸要求自己調(diào)用自己,如果函數(shù)有名字,這就太簡單不過了。

利用變量實現(xiàn)遞歸

函數(shù)還可以賦給一個變量,不過要實現(xiàn)遞歸,函數(shù)體里面還是要依賴這個變量名:

var f = function(n) {
 if (n < 2) {
  return n;
 } else {
  return n * f(n - 1);
 }
}
console.log(f(5));

應(yīng)該說這種方式跟之前的其實沒有本質(zhì)的不同。

匿名遞歸

現(xiàn)在我們來探討匿名遞歸的實現(xiàn)。

初步設(shè)想

如果想要返回一個匿名遞歸函數(shù),又或者是定義一個匿名遞歸函數(shù)并直接調(diào)用它:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * ?(n - 1);
 }
})(5);

如果沒有一個名字,代碼中那個問號我們就不知道要填寫什么,就沒法形成遞歸了,此時我們要怎么辦呢?這時就要請出 arguments 對象了。

arguments 對象

在 javascript 的函數(shù)中,arguments 對象代表了實際調(diào)用時的參數(shù)對象。在我們的遞歸函數(shù)中,實際上我們也可以完全不用去定義“形式參數(shù)” n:

function factNoParam() {
 if (arguments[0] < 2) {
  return arguments[0];
 } else {
  return arguments[0] * factNoParam(arguments[0] - 1);
 }
}
console.log(factNoParam(5));

只要我們在調(diào)用時傳入了實際的參數(shù),就可以用 arguments[0] 取得實際傳入的這個參數(shù)的值。

如果有更多的參數(shù),還可以 arguments[1],arguments[2] 等來取得。

arguments.callee 屬性

arguments 可以用來獲取參數(shù),相信你可能已經(jīng)知道了,但 arguments 對象其實還有一個屬性,即所謂的 callee。arguments.callee 代表了這個函數(shù)本身。這是什么意思呢?其實我們完全可以把 fact 寫成這樣:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
}
console.log(fact(5));

那么它依然是遞歸的。因為 arguments.callee 實際就等于 fact。

那么,到了這里,有了這個屬性的幫助,要實現(xiàn)匿名遞歸就不難了,只要把 ? 改為 arguments.callee 即可:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
})(5);

如果有需要,也可以把它作為匿名遞歸返回。

關(guān)于 javascript 實現(xiàn)匿名遞歸的介紹就到這里。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI