2016-07-12 36 views
0

我對運行以下函數的確切執行時間線有點困惑。我看到MDN引導驗證碼:瞭解遞歸函數在javascript中的工作方式

function foo (i) { 
    if (i<0) return; 
    console.log('begin' + i); 
    foo(i-1); 
    console.log('end' + i); 
} 

根據我的職能是如何工作的知識,這是我的想法,但我的知識是不夠的:

我覺得當函數foo(3)被調用時,它將轉到該功能並檢查條件if i < 0,然後它將運行下一個代碼console.log('begin:' + i)

之後,執行下一行代碼,由於JavaScript逐行執行,下一行代碼foo(i-1)將被執行。

需要將當前值i3減1,因此調用foo(2)並繼續執行。


我的問題是:我的理解是否正確?。如果沒有,請解釋這段代碼正在做什麼,否則任何人都可以簡單解釋一下函數何時會停止被調用?

+3

那麼,什麼*不*它做的,你是什麼困惑關於? – deceze

+0

'FOO(3)' 開始3 開始2 開始1 開始0 結束0 結束1周 端2 端3 – BNilsou

+1

從你的描述,你** **不明白這個遞歸函數是如何工作的! – Jamiec

回答

2

,當你調用foo(3)是(以僞代碼)如下會發生什麼:

execute foo(3) 
    3 is greater than 0 thus log(begin 3) 
    execute foo(2) 
     2 is greater than 0 thus log(begin 2) 
     execute foo(1) 
      1 is greater than 0 thus log(begin 1) 
      execute foo(0) 
       0 is equal to 0 thus log(begin 0) 
       execute foo(-1) 
        -1 is less than 0 thus return 
       log(end 0) 
      log(end 1) 
     log(end 2) 
    log(end 3) 
return 
+0

請注意(結束0) 日誌(結束1) 日誌(結束2) 日誌(結束3) 返回哪些條件導致打印出來的那些。 – pedroyanky

+0

@pedroyanky沒有條件導致這些。當在它們之前調用的函數(例如'foo(0)')返回時,調用函數將繼續執行,以便它將運行下一行代碼,即「log(end ...)」。想想'foo()'函數裏面的'foo(number)'調用是另一行代碼,可以是其他任何東西(比如像console.log('')'這樣的一行)希望這可以幫助你瞭解遞歸如何工作! –

1

它的工作原理是這樣的:

foo(3)-> 

if (3 < 0) 
    return 
console.log('begin' + 3) 
if (2 < 0) 
    return 
console.log('begin' + 2) 
if (1 < 0) 
    return 
console.log('begin' + 1) 
if (0 < 0) 
    return 
console.log('begin' + 0) 
if (-1 < 0) 
    return 
console.log('end' + 0) 
console.log('end' + 1) 
console.log('end' + 2) 
console.log('end' + 3)