2014-12-09 3 views
0

Я пытаюсь написать рекурсивный алгоритм, который позволяет подсчитать указанную букву пользователем. Но я застрял в двух случаях. Во-первых, я думаю, что я должен получить 2 в результате, я не могу. Во-вторых, если нет предельного ключа, например, предельного символа, указанного как z пользователем, как символы могут быть отсканированы до конца символа здесь g? Проблема немного сложная для меня. Мне нужны ваши советы и идеи. Спасибо всем благодарным ответам.Указанное количество букв с рекурсией

пример строка: how are you i am testing

еще примеры:

example

#include <stdio.h> 

int lettercount(char* str, char key, char limit); 

int main(){ 

    char test[]="how are you i am testing"; 
    int num; 

    num=lettercount(test,'a','t'); 

    printf("%d",num); 

    return 0; 
} 
int lettercount(char* str, char key, char limit) 
{ 
    int count = 0; 

    if(str[0] == limit) 
    { 
     return 0; 
    } 
    else if(str[0] == key) 
    { 
     lettercount(&str[1], key, limit); 
     count++; 
    } 
    else 
     lettercount(&str[1], key, limit); 

     return count; 
} 
+0

Вам нужно проверить, является ли str [0] терминатором NUL '' \ 0'', кроме проверки того, равен ли он 'limit'. Кроме того, вы возвращаете 'count' из функции' lettercount', но вы игнорируете возвращаемое значение при вызове функции рекурсивно. – user3386109

+0

umm да, вы правы насчет NULL. Я вернул счет? @ user3386109 –

+0

Последняя строка вашей функции - 'count count;' – user3386109

ответ

0
as the code is unwinding from the recursion(s) 
it needs to accumulate the count 
the following code should work for your needs. 
Note: this returns 0 if key and limit are the same char 

int lettercount(char* str, char key, char limit) 
{ 
    int count = 0; 

    if(str[0] == limit) 
    { 
     return 0; 
    } 

    // implied else, more char in string to check 

    if(str[0] == key) 
    { 
     count++; 
    } 

    count += lettercount(&str[1], key, limit); 

    return count; 
} // end function: lettercount 
0

С рекурсивной функции, вам нужно вещи. (1)настроен в функции, которая готовится к следующему вызову; (2)рекурсивный звонок; и (3)Способ прекращения деятельности Рекурсия. Вот один из подходов. Примечание: версии в коде ниже это долго версия для удобства чтения, короткая версия включена в конце:

#include <stdio.h> 

/* recursively find the number of occurrences 
of 'c' in 's' (n is provided as '0') 
*/ 
int countchar (char *s, char c, int n) 
{ 
    char *p = s; 
    if (!*p) 
     return n; 

    if (*p == c) 
     n = countchar (p+1, c, n+1); 
    else 
     n = countchar (p+1, c, n); 

    return n; 
} 

int main (int argc, char **argv) { 

    if (argc < 3) { 
     fprintf (stderr, "\n error: insufficient input. Usage: %s <string> <char>\n\n", argv[0]); 
     return 1; 
    } 

    int count = countchar (argv[1], *argv[2], 0); 

    printf ("\n There are '%d' '%c's in: %s\n\n", count, *argv[2], argv[1]); 

    return 0; 
} 

выход:

$ ./bin/rec_c_in_s "strings of s'es for summing" s 

There are '5' 's's in: strings of s'es for summing 

Вы можете делают функцию более короткой, но немного менее читаемой:

int countchar (char *s, char c, int n) 
{ 
    char *p = s; 
    if (!*p) return n; 

    return countchar (p+1, c, (*p == c) ? n+1 : n); 
} 
Смежные вопросы