2016-08-16 82 views
4
void func(int num){ 
    if(num< 3){ 
     printf("%d ", num); 
     func(num+ 1); 
     printf("%d ", num); 
    } 
} 

假設我用func(0)調用這個函數。 爲什麼結果0 1 2 2 1 0? 我不知道爲什麼它在減少。遞歸:不明白這個結果

+5

的前三個數字來自第一個printf,第二三個數字來自於第二個printf作爲堆解開。爲了更好地理解,請嘗試'「a:%d」'和'「b:%d」'作爲格式字符串。 – user3386109

+0

是的,我明白了,但是爲什麼它會從2變爲0,這對我沒有意義? –

+0

你的代碼什麼都不做,因爲函數從來沒有被調用過。 –

回答

11

這裏有一個堆棧跟蹤

f(0) 
    print 0 
    f(1) 
     print 1 
     f(2) 
      print 2 
      f(3) // 3 < 3 == false 
      print 2 
     print 1 
    print 0 
+0

好吧很酷,所以我得到爲什麼3是錯誤的,它打印出2.但爲什麼它之後也打印1和0? –

+1

當您在另一個函數(A)中調用函數(B)時,您不會中斷函數(A),一旦被調用函數(B)完成,您將它堆疊並返回到函數 – CMPS

+0

哇,謝謝,我從來沒有想到過。這清理了很多東西。 –