C, Ricorsione sulle stringhe

di il
13 risposte

C, Ricorsione sulle stringhe

Devo realizzare la seguente funzione:

int pari(char* s);
che, presa in input una stringa e SENZA USARE la funzione strlen, restituisce 1 se la stringa contiene un numero pari di caratteri (escluso il terminatore di stringa) e 0 altrimenti.
Nell’implementazione di tale funzione non è consentito l’uso di cicli, né nella funzione stessa né in eventuali funzioni ausiliare che essa dovesse usare.


Io stavo pensando a questo:

Per fermare la ricorsione:
if(s[y] == '\0')
return;
Però, se uso y, come indice, lo devo inizializzare nella funzione ricorsiva. Se lo inizializzo (int y = 0) ogni volta che la funzione riparte y torna a zero.

Comunque, se non entrasse in questo if, allora dovrei in qualche modo incrementare una variabile cont che conterebbe la lunghezza della stringa.. Se poi cont % 2 == 0 allora return 1 else return 0.

Poi ogni volta che richiamerei la funzione, farei pari(s[y + 1]);

Avevo fatto questa cosa qui, che funziona. Però non va bene perché pari non è ricorsiva
int pari(char* s)
{
	int i = 0, res;
	res = conta(s, i);

	if(res % 2 == 0)
		return 1;
	else
		return 0;
	
}

int conta(char *str, int y)
{
	if(str[y] == '\0')
		return y;
	else
		if(str[y] != '\0')
			conta(str, y+1);
}
Il mio problema principale è questo. Come scorrere la stringa? Perché nel prototipo della funzione int pari(char *s) come parametro ho solo la stringa. Se, invece, avessi int pari(char *, int indice) sarebbe più facile..

Mi date qualche consiglio? Grazie

13 Risposte

  • Re: C, Ricorsione sulle stringhe

    Un esempio potrebbe essere
    
    int pari(char *s)
    {
    	static int r=0;
    	
    	r = !r;
    
    	if(!*s) return r;
    
    	return pari(++s);
    }
  • Re: C, Ricorsione sulle stringhe

    Aspetta, devi chiarirmi alcune cose perfavore..

    Allora una variabile dichiarata static, se non sbaglio, mantiene il suo contenuto anche se la funzione viene richiamata.

    r = !r, qualunque valore intero di r diventa 0?


    if(!*s)
    return r;


    entra nell'if sono se la condizione è vera.
    !*s che vuol dire?

    return pari(++s);

    equivale a

    s++;
    return pari(s);

    ? E cosa fa? Cioè, incremente di uno la posizione della cella della stringa?
  • Re: C, Ricorsione sulle stringhe

    davide.fruci ha scritto:


    Allora una variabile dichiarata static, se non sbaglio, mantiene il suo contenuto anche se la funzione viene richiamata.
    Mantiene il valore tra una chiamata e l'altra.
    r = !r, qualunque valore intero di r diventa 0?
    No ... altrimenti a che servirebbe? Rifletti su cosa fa l'operatore !
    !*s che vuol dire?
    Che *s non è diverso da zero (vedi sempre il significato di ! )
    return pari(++s);

    equivale a

    E cosa fa?
    s è un puntatore. Se incrementi il puntatore questo punta alla prossima cella della stringa.
  • Re: C, Ricorsione sulle stringhe

    davide.fruci ha scritto:


    r = !r, qualunque valore intero di r diventa 0?
    No ... altrimenti a che servirebbe? Rifletti su cosa fa l'operatore !
    Sì, è vero. Non servirebbe a niente altrimenti
    #include <stdio.h>
    
    int main()
    {
    	int a = 2;
    	printf("a: %d\n", a);
    	a = !a;
    	printf("a: %d\n", a);
    }
    il quale stampa:
    a: 2
    a: 0
    ..?

    ! è l'operatore not, di negazione. Giusto?

    Verifica che non sia uguale a zero?
  • Re: C, Ricorsione sulle stringhe

    Eseguila più volte con il valore 0 iniziale ...
  • Re: C, Ricorsione sulle stringhe

    Ma la funzione che ho postato io dici?
    #include <stdio.h>
    
    int main()
    {
    	int a = 0;
    	int i = 0;
    	while(i < 5)
    	{
    	        a = !a;
    		printf("(%d) a: %d\n", i, a);
    		i++;
    	}
    }
    stampa:

    (0) a: 0
    (1) a: 1
    (2) a: 0
    (3) a: 1
    (4) a: 0
  • Re: C, Ricorsione sulle stringhe

    Quindi, cosa ne deduci?
  • Re: C, Ricorsione sulle stringhe

    Ne deduco che inverte il valore.. Anche con a, inizialmente inizializzata con qualunque altro numero, stampa sempre la stessa cosa..
  • Re: C, Ricorsione sulle stringhe

    E tornando al tuo esercizio, hai capito a cosa serve?
  • Re: C, Ricorsione sulle stringhe

        int pari(char *s)
        {
           static int r=0;
           
           r = !r;
    
           if(!*s) return r;
    
           return pari(++s);
        }
    Allora:

    r = 0;

    r = !r, quindi r = 1;

    !*s ma vuol dire che inverte il valore del contenuto di quella cella?

    if(!*s) entra solo se la condizione è true. Entrando restituisce r.

    Altrimenti richiama la funzione spostandosi di una cella.
  • Re: C, Ricorsione sulle stringhe

    Tutto chiaro quindi?
  • Re: C, Ricorsione sulle stringhe

    Insomma.. è giusto quindi che !*s inverta il valore del contenuto della cella?

    Ad esempio, se la stringa passata fosse "ciao":

    r = 0;
    r = !r, quindi r = 1;

    if(!s[0]) entra se la condizione è == 1, ma in quel momento si sta riferendo a s[0] ovvero c.. è qui che non capisco!
    return 1;
    return pari(++s);
  • Re: C, Ricorsione sulle stringhe

    !*s

    è vero solo se *s è 0 quindi solo per il carattere terminatore della stringa.
Devi accedere o registrarti per scrivere nel forum
13 risposte