2015-05-29 174 views
1

遞歸調用我有以下功能是混淆了我

int vowels(char *str) 
{ 
    int count = 0; 
    if (! str[0]) 
     return count; 
    if (strchr("aeiouAEIOU", str[0])) 
     count ++; 
    return count + vowels(&str[1]); 
} 

執行計算所有出現在字符串中的元音,是什麼讓我困惑的是遞歸調用元音(&海峽[1])做不明白爲什麼每次打電話去下一個字符,不要這樣做str ++。他們可以幫助我理解這一點?請。

+0

看起來像一個遞歸練習 – marom

+0

STR應該是const BTW – Axalo

回答

2

在這一聲明如下

int vowels(char *str); 

雖然我將宣佈它像

size_t vowels(const char *str); 

表達

&str[1] 

每個函數調用相當於

str + 1 

++str 

但是你可能不使用

str++ 

,因爲表達式的值是遞增之前存儲在str地址。

至於我,我會定義函數通過以下方式

size_t vowels(const char *s) 
{ 
    return *s ? (strchr("aeiouAEIOU", *s) != NULL) + vowels(s + 1) : 0; 
} 
+0

我測試++海峽,它的工作原理是 – Kevin

+0

@Tony應該爲我的工作在我的帖子中指出:) :) –

+0

@Tony看到我更新的帖子。 –

0

如果下一個元素的地址是&str[1],那麼沒有理由做str++

2

vowels(&str[1])調用vowels使用&str[0]之後的1個字節的地址,在存儲器中開始str。因爲strchar *,這意味着它使用字符串減去其第一個字符。

請注意,你不會想要做str++&str++,因爲這些會嘗試修改str本身,而不是僅僅使用該字符串的一部分。

0

井字符串存儲在內存中。這是做什麼是將字符的地址傳遞給函數str的字符指針。所以&str[1]只是數組下一個字符的地址(它只是跳到下一個字節)。