递归调用让我困惑

时间:2015-05-29 18:19:20

标签: c recursion

我有以下功能

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

执行对字符串中出现的所有元音的计数,令我困惑的是递归调用元音(& str [1])不明白为什么每次调用都转到下一个字符,没有这样做 str ++ 。他们可以帮我理解这个吗?请。

4 个答案:

答案 0 :(得分:2)

vowels(&str[1])使用vowels之后的地址1字节调用&str[0]str是内存中str的开头。因为char *str++,这意味着它使用字符串减去其第一个字符。

请注意,您不希望&str++str,因为那些会尝试修改 statsG.append(str(diameter_Glob[1]-diameter_Glob[0])+"\t"+str(100*(diameter_Glob[1]-diameter_Glob[0])/diameter_Glob[1])+"\t"+str(pval[1])) statsG2=np.reshape(statsG,(1,3)) np.savetxt(path+'Stats.txt',statsG2,'%s') GlobalStats.append(str(start)+"\t"+str(stop)+"\t"+str(statsG2)) np.savetxt('/Volumes/old/RESULTS.txt',GlobalStats, '%s') 本身,而不仅仅是使用部分字符串。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

如果使用str++获取下一个元素的地址,则没有理由&str[1]

答案 3 :(得分:0)

井字符串存储在内存中。这样做是将char的地址传递给函数Num的char指针。所以str只是数组的下一个字符的地址(它只是跳转到下一个字节)。