2012-12-11 32 views
6
int count(string s){ 
    if(s == "") 
     return 0; 
    if(s.length == 1) 
     return 1; 
    return 1 + count() //This is what I can't figure out. How to traverse the string. 
    //I just need a hint, not a full on answer. 
} 

Nie wiem, jak przejść ciąg znaków.Próba określenia długości ciągu za pomocą rekursji w C++

+2

Wskazówka: Wielkość napisu to 1 + rozmiar ciągu z usuniętym pierwszym (lub ostatnim) znakiem. Rozmiar pustego łańcucha wynosi zero. – zackg

+0

Brzmi jak praca domowa dla mnie .. teraz co prawdopodobnie chcesz zrobić na drugiej ostatniej linii: return 1 + count (s.substr (0, s.length() - 1)); – Nils

+1

Tak, to praca domowa. Nic specjalnego, ale dość dobrze mnie wkurza. –

Odpowiedz

10

Podpowiedź: użyj substr() w rekursji.

Masz również dwie skrzynki bazowe. Jeden z nich ma trzy problemy:

  1. ma błąd składni;
  2. polega na tym, że jest w stanie obliczyć długość struny (co ma spełniać twoja funkcja);
  3. jest to niepotrzebne, ponieważ masz inny podstawowy przypadek.
+0

Dam ci ten strzał, dziękuję! –

+0

Umieściłem dwie podstawowe skrzynki, ponieważ powiedziały, że jeśli ciąg znaków jest pusty, zwracam 0, a następnie umieszczam podstawowy argument o długości == 1, jeśli było> 0. –

+1

@ user1893303 można użyć 0 jako podstawowego przypadku. –

1

Jeśli Twoim celem jest przechodzenie przez ciąg, sugeruję użycie iteratora (zobacz std::string::begin).

template<typename It> 
int count(It const begin, It const end) 
{ 
    return (begin != end ? count(begin + 1, end) + 1 : 0); 
} 

int count(std::string const& s) 
{ 
    return count(s.begin(), s.end()); 
} 
+1

W jaki sposób korzysta się z rekursji? –

+1

@JanDvorak: jeśli argument funkcji jest iteratorem (wraz z iteratorem "end"), jest rekursywny. –

1

Może chcesz użyć substr.

+0

Pracował jak urok. Dziękuję –

3

Nie sądzę, że przykład ma jakiś sens, używasz length, który już zwraca długość w obliczeniach. Gdybym był twoim nauczycielem, nie zaakceptowałbym tego jako prawidłowego rozwiązania.

Prawdopodobnie trzeba użyć const char*

int count(const char* s){ 
    if(*s == '\0') 
     return 0; 
    return 1 + count(s + 1); 
} 
+1

Nie masz _need_ 'const char *', nawet "char *". –

+1

Problem nie polega na tym, że ciąg zna jego długość, ale że OP używa go jako przypadku bazowego. – irrelephant

+0

Z innych przykładów okazało się, że wszystkie używały znaków, ale wymaganiem pytania było użycie typu danych ciąg.Wiem, że to głupie, aby policzyć długość w rekursji, gdy wszystko, co musisz, to funkcja length(), ale myślę, że prof chce, abyśmy przynajmniej doświadczali rekurencji łańcuchowej. –

0

wiem, że chcesz roztwór C++, ale nadal. Czasem C jest lepsze niż C++.

 
int count(const char *s) 
{ 
    if(*s == 0) 
    return 0; 
    else return 1 + count(++s); 
}; 

Zadzwoń jako liczba (str.c_str()).

0
#include<stdio.h> 
    main(){ 
    char str1[100]; 
    gets(str1); 
    int i=0;i=len(str1,i);printf(" \nlength of string is %d",i); 
    } 
    int len(char s1[],int i) { 
    printf("\n%c",s1[i]); 
    int sum=0,count =1; 
    if(s1[i] == '\0') return 0; 
    else 
    return (count += len(s1,++i)); 
    }