首頁  >  文章  >  web前端  >  JS的遞迴實作方法

JS的遞迴實作方法

php中世界最好的语言
php中世界最好的语言原創
2018-04-18 09:07:402845瀏覽

這次帶給大家,的注意事項有哪些,下面就是實戰案例,一起來看一下。

遞歸函數:遞歸函數是在透過名字呼叫自身的情況下構成的。

遞迴實作階乘函數:

# 方法一:透過使用函數的名字

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

結果為:24;

但是這種方法實作遞歸有一個問題,觀察以下程式碼:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  console.log(anthorFactorial(4));

# 結果為:24;

但是:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

結果為:報錯

這是因為:

我們定義的函數名,其實是指向函數的一個指針,定義的anotherFactorial 也指向了那個函數,所以呼叫anotherFactorial (4)可以成功的輸出24

# 當 factorial = null時,執行定義函數的參考就剩下了anotherFactorial,那麼在呼叫anotherFactorial(4)就會顯示以上的錯誤的資訊。

此時可以使用arguments.callee來取代函數定義中的 factorial。

方法二:透過使用arguments.callee

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*arguments.callee(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

# 結果為:24

arguments.callee是一個指向正在執行的函數的指針,因此可以用arguments.callee來實現對函數的遞歸呼叫。透過使用arguments.callee來取代函數名,可以保證在呼叫函數時無論怎樣都不會出現問題。因此,在編寫遞歸函數時,使用argumnts.callee總比使用函數名稱更加保險。
但是,在嚴格模式下,不能透過腳本存取arguments.callee,存取這個屬性會報錯,不過可以透過命名函數表達式來達到相同的效果。

方法三:透過命名函數表達式

 var factorial=function f(num){
    if(num<=1){
      return 1;
    }else{
      return num*f(num-1);
    }
  };
  f=null;
  console.log(factorial(4));

這種方式在嚴格和非嚴格模式下都有效。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:



#

以上是JS的遞迴實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn