成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

遞歸函數(shù)的執(zhí)行

tomato / 2863人閱讀

摘要:遞歸一個函數(shù)可以指向并調用自身。這是的一個獨特的用法,在這個結構下無法替代,出錯但我們可以用下面這種方式,把遞歸函數(shù)賦值給一個變量

遞歸(Recursion)

一個函數(shù)可以指向并調用自身(call itself)。有三種方法可以達到這個目的:

函數(shù)名

arguments.callee

作用域下的一個指向該函數(shù)的變量名

上述概念引用自MDN,對遞歸概念不清楚的可以自行查看;

遞歸函數(shù)的執(zhí)行

在這里我們討論一下遞歸函數(shù)中遞歸后的語句如何執(zhí)行,先看這樣一個例子:

function rec(x){
if(x!==1){
   console.log(x)
   rec(x-1)
   console.log(x) 
   }   
}
rec(5) //輸出為5 4 3 2 2 3 4 5

以上這段代碼執(zhí)行的結果就是遞歸前的語句順序執(zhí)行,遞歸后的語句倒序執(zhí)行。初看到這段代碼,完全不能理解它執(zhí)行的順序。通過調試讓代碼逐行執(zhí)行,可以看到執(zhí)行的順序,其實就是一層一層執(zhí)行遞歸,每執(zhí)行到rec(x-1)時就重新執(zhí)行該函數(shù),遞歸后的語句會在遞歸執(zhí)行到最里層后再由內向外輸出。
CSDN上的一篇博客很好的總結了遞歸的特性如下:
1 每一次函數(shù)調用都會有一次返回.當程序流執(zhí)行到某一級遞歸的結尾處時,它會轉移到前一級遞歸緊接著的后面繼續(xù)執(zhí)行.
2 遞歸函數(shù)中,位于遞歸調用前的語句和各級被調函數(shù)具有相同的順序.如打印語句 #1 位于遞歸調用語句前,它按照遞歸調用的順序被執(zhí)行了 4 次.
3 每一級的函數(shù)調用都有自己的私有變量.
4 遞歸函數(shù)中,位于遞歸調用語句后的語句的執(zhí)行順序和各個被調用函數(shù)的順序相反.
5 雖然每一級遞歸有自己的變量,但是函數(shù)代碼并不會得到復制.
6 遞歸函數(shù)中必須包含可以終止遞歸調用的語句.

在這個例子中,終止遞歸調用的條件是if(x!==1),如果調用時取值x小于1,會構成死循環(huán);這個例子中的遞歸采用了通過函數(shù)名調用的方法。
下面我們再討論一下argumengts.callee方式,在ES5嚴格模式下,callee是無法使用的,原因詳見MDN中arguments.callee。

這是callee的一個獨特的用法,在這個結構下無法替代,

function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * factorial(num-1);
    }
}
var anotherFactorial = factorial;
alert(anotherFactorial(4)); //出錯!

但我們可以用下面這種方式,把遞歸函數(shù)賦值給一個變量:

var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/86925.html

相關文章

  • 翻譯連載 | 第 9 章:遞歸(下)-《JavaScript輕量級函數(shù)式編程》 |《你不知道JS》

    摘要:每個函數(shù)調用都將開辟出一小塊稱為堆棧幀的內存。當?shù)诙€函數(shù)開始執(zhí)行,堆棧幀增加到個。當這個函數(shù)調用結束后,它的幀會從堆棧中退出。保持堆棧幀跟蹤函數(shù)調用的狀態(tài),并將其分派給下一個遞歸調用迭。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTM...

    LeviDing 評論0 收藏0
  • JavaScript專題之遞歸

    摘要:專題系列第十八篇,講解遞歸和尾遞歸定義程序調用自身的編程技巧稱為遞歸。然而非尾調用函數(shù),就會創(chuàng)建多個執(zhí)行上下文壓入執(zhí)行上下文棧。所以我們只用把階乘函數(shù)改造成一個尾遞歸形式,就可以避免創(chuàng)建那么多的執(zhí)行上下文。 JavaScript 專題系列第十八篇,講解遞歸和尾遞歸 定義 程序調用自身的編程技巧稱為遞歸(recursion)。 階乘 以階乘為例: function factorial(n...

    asoren 評論0 收藏0
  • 最大子序列求解-分治方法

    摘要:下面進行簡單的作圖分析注意到,遞歸函數(shù)從外層,沿著計算的路徑,經(jīng)過三次遞歸調用函數(shù),到達基準,在基準層分別計算遞歸函數(shù)內部的三部分左側最大子序列與右側最大子序列的和,并利用求出最大者返回。 問題描述 問題:給定整數(shù)序列,求解其中最大子序列(連續(xù)的序列)。 思路分析 利用分治和遞歸的思想求解,在《數(shù)據(jù)結構與算法分析(Java語言描述)》Page29,作者給出了具體的java代碼。...

    microelec 評論0 收藏0
  • 【從蛋殼到滿天飛】JAVA 數(shù)據(jù)結構解析和算法實現(xiàn)-鏈表與遞歸

    摘要:鏈表與遞歸已經(jīng)從底層完整實現(xiàn)了一個單鏈表這樣的數(shù)據(jù)結構,并且也依托鏈表這樣的數(shù)據(jù)結構實現(xiàn)了棧和隊列,在實現(xiàn)隊列的時候對鏈表進行了一些改進。計算這個區(qū)間內的所有數(shù)字之和。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言 【從蛋殼到滿天飛】JAVA 數(shù)據(jù)結構解析和算法實現(xiàn),全部文...

    lastSeries 評論0 收藏0
  • 【從蛋殼到滿天飛】JAVA 數(shù)據(jù)結構解析和算法實現(xiàn)-鏈表與遞歸

    摘要:鏈表與遞歸已經(jīng)從底層完整實現(xiàn)了一個單鏈表這樣的數(shù)據(jù)結構,并且也依托鏈表這樣的數(shù)據(jù)結構實現(xiàn)了棧和隊列,在實現(xiàn)隊列的時候對鏈表進行了一些改進。計算這個區(qū)間內的所有數(shù)字之和。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言 【從蛋殼到滿天飛】JAVA 數(shù)據(jù)結構解析和算法實現(xiàn),全部文...

    alanoddsoff 評論0 收藏0

發(fā)表評論

0條評論

tomato

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<