2013-12-17 109 views
-7
#include<stdio.h> 

int foo(char a[]) 
{ 
    if(a[1]=='\0') 
    { 
     return 0; 
    } 
    foo(a+1); 
    foo(a+1); 
    printf("%c ",a[1]); 
} 

int main() 
{ 
    foo("123"); 
} 

爲什麼上面的程序的輸出:3 3 2 我想輸出是:3 請explain..Thank你。遞歸C語言

+1

請使用正確的縮進代碼中的下一次 – DrummerB

+3

有你試圖把一些額外'的printf()'語句來看看發生了什麼在執行期間,還是使用運行時調試器(如GDB等)在執行期間監視變量的值? – DevNull

+1

使用調試選項編譯(例如'gcc -Wall -g')。使用調試器('gdb')並逐步運行程序'step'。 –

回答

3

這基本上是按照時間順序會發生什麼:

foo(['1','2','3','\0']): 
    a[1] != '\0' 
    foo(['2','3','\0']): 
     a[1] != '\0': 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     print '3' 
    foo(['2','3','\0']): 
     a[1] != '\0': 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     print '3' 
print '2' 

注意事項:

  • 遞歸首先要「在」,只有當「回來」它打印元素。
  • 一個[1]指的是第二個元素,不是第一次(因爲數組索引從0開始)
  • 印刷occures每次遞歸獲取到printf陳述 - 而這一次以上,它發生每當函數不會在停止子句中結束。
2

您的代碼是遞歸的,但是當調用foo(..)時,它會修改本地值a而不是全局值。

因此,當代碼從內部foo(..)返回時,會打印一個[1],它是原始字符串中的「2」。

這就是爲什麼你看到3,3,然後當最後遞歸的回報,2

關係到我下面的評論:

int foo(char a[]) 

進入

int foo(char *a) 

並且

foo("123"); 

進入

char string[] = "123"; 
foo(&string); 

您還需要更改a[1]a+1

+0

所以如果我做foo(++ a)而不是foo(a + 1),那麼它應該改變全局'a'? – user1915016

+0

除非您傳遞給'foo(..)'''a''的'*(指針),否則'foo()'不能訪問外部(全局) – nrathaus