2013-11-13 3 views
0

Я довольно новый с рекурсией. Мне нужно написать две функции. Пока я написал один, который дает право на поиск длины строки. Однако второй, который заключается в следующем: поиск повторяющегося символа в массиве оказывается очень сложным. Я просмотрел веб-страницы, пытаясь найти примеры, я много читал, но ничего до сих пор. Поэтому, если бы вы могли указать мне в правильном направлении, я был бы очень признателен.Найти количество символов в массиве с использованием рекурсии

Спасибо

//length() -- this function is sent a null terminated array of characters. 
    //The function returns the length of the "string".  
    long slength (const char ntca[]) 
     { 
      int length = 0; 

      if (ntca[length] == '\0'){ 
       return 0; 
      } 
      else{ 
       return slength(ntca+1)+1; 
      } 
     } 

     //countall() -- This function is sent a null terminated array of characters 
     //and a single character. The function returns the number of times the character 
     //appears in the array. 

     long countall (const char ntca[],char letter){ 

      int position = 0; 
      int counter = 0; 
      long length = slength(ntca); 

      if (length == 0) 
       return 0; 

      else if (ntca[position]==letter) 
       return 1 + countall(ntca-1,letter); 
      else 
       return countall(ntca,letter); 


     } 
+0

Обратите внимание, что я бы написал рекурсивную длину строки, но кажется, что функция длины хочет прочитать 'long slength (char const * s) {return * s? 1 + slength(): 0; } ' –

+1

Вы близко. Обратите внимание, как в первой функции вы перемещаете один символ вперед в строке каждый раз? Вы должны сделать то же самое в 'countall()', как в том случае, когда «letter» соответствует, так и в том случае, если это не так. В одном случае вы в настоящее время поддерживаете резервную копию (на неизвестной территории); в другом случае вы просто вызываете 'countall' на одного и того же символа снова и снова. –

+0

Вы, конечно же, не хотите вычислять длину строки для второй функции! Если строка не пустая, добавьте 1, если передним символом является запрошенная буква к результату 'countall()' с хвостом строки: 'long countall (char const * s, char l) {return (* s == l) + (* s? countall (s + 1, l): 0); } '. Ваша ошибка в том, что вы либо придерживаетесь одной позиции, либо даже возвращаетесь назад! –

ответ

1

Вы можете попробовать следующий код:

long countall(const char *ptr, char letter) 
{ 
    if(!*ptr) return 0; //base case 
    return (*ptr == letter) + countall(ptr + 1, letter); 
} 

Базовый случай рекурсии, когда функция встречает конец строки. Для empty string и любой буквы answer is 0.

Если строка не пуста, мы получим add 1 к результату recursive call on shorter string тогда и только тогда, когда current char matches letter.

Смежные вопросы