#c #string #recursion
#c #строка #рекурсия
Вопрос:
Я просто хочу посчитать гласные в строке, используя рекурсию, но это не работает.
#include <stdio.h>
#include <string.h>
#define SETSIZ 10
#define TRUE 1
#define FALSE 0
int is_empty(const char *set);
int is_element(char vowel, const char *set);
int is_vowel(const char *vowels, const char *set);
int main(void)
{
int count = 0,i;
char vowels[11] = {'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', ''}, set[SETSIZ] = "mustafa";
for(i=0;i<strlen(set);i ){
if(is_vowel(vowels, set))
count = 1;
}
printf("%s has %d vowels",set, count);
return(0);
}
int is_empty(const char *set)
{
return(set[0] == '');
}
int is_element(char vowel, const char *set)
{
int ans;
if(is_empty(set))
ans = FALSE;
else if (vowel == set[0])
ans = TRUE;
else
ans = is_element(vowel, amp;set[1]);
return(ans);
}
int is_vowel(const char *vowels, const char *set)
{
int ans, i = 0;
if(is_empty(vowels))
ans = FALSE;
else if(is_element(vowels[0], set))
{
printf("**");
ans = TRUE;
}
else
{
printf("--");
ans = is_vowel(amp;vowels[1], set);
}
return(ans);
}
Комментарии:
1. В
main
вы перебираетеset
(который, по-видимому, не существует в этой области) и всегда передаете одно и то же вis_vowel
. Вы никогда не используете счетчик цикловi
.2.
set
определяется в области прокрутки. Я тоже сначала думал, что это не было определено. К OP: @paranoidgnu — ограничить длину строки 80 символами 🙂
Ответ №1:
В вашем коде is_vowel есть проблема.
int is_vowel(const char *vowels, const char *set)
{
int ans, i = 0;
if(is_empty(vowels)) //You are passing vowels which would never be empty.
ans = FALSE; //Replace it with set character pointer.
//Rest of the code
Вся концепция, применяемая, кажется, неправильной, приятель .Я бы посоветовал вам переписать код.Во всем коде бесчисленное количество ошибок.
Ответ №2:
В main
вашем цикле for вызывается is_vowel()
несколько раз с точно такими же аргументами.
Возможно, вы захотите переписать функцию с помощью более простого прототипа:
/* int is_vowel(const char *vowels, const char *set); */
int is_vowel(const char *vowels, int ch);
Ответ №3:
#include <stdio.h>
int vowel(char str[],int k)
{
int count = 0;
while(str[k]!='')
{
if(str[k] == 'a' || str[k] == 'e' || str[k] == 'i' || str[k] == 'o' || str[k] == 'u')
return 1 vowel(str,k 1);
else
return 0 vowel(str,k 1);
}
return 0;
}
void main()
{
char x[50];
gets(x);
printf("%d",vowel(x,0));
}
Ответ №4:
-
Вы не выполняете цикл
set
, как вам, вероятно, хотелось бы. Должно быть:if(is_vowel(vowels, amp;set[i]))
-
Ваша функция
is_element()
абсолютно неверна, вы можете изменить ее на:int is_element(char vowel, const char *set) { return (vowel == set[0]); }
или даже передавать символы вместо указателей на символы.
Ответ №5:
Существует более простое решение вашей проблемы:
#define VOWELS "aeiouAEIOU"
size_t vcount(const char *s)
{
size_t i = 0;
while (s amp;amp; *s) {
if (strchr(VOWELS, *s)) i;
s;
}
return i;
}
Его можно легко преобразовать в рекурсивную версию.
Ответ №6:
Вы можете использовать этот код на python для подсчета количества гласных:
определить гласные (ы):
if s == '':
return 0 # no vowels in the empty string
elif s[0] in 'aeiouAEIOU':
return 1 vowels( s[1:] )
else:
return 0 vowels( s[1:] )
Вы также можете использовать переменную, такую как vowel_list=’aeiouAEIOU’