Funzione ricorsiva per verificare se una parola è palindroma

di il
7 risposte

Funzione ricorsiva per verificare se una parola è palindroma

Ciao a tutti, vi volevo chiedere come mai con questa definizione di funzione mi ritorna sempre il valore 0?!

int palindroma(int *v, int n){
if (n == 0) return 1;
else if (n == 1) return 1;
else{
if (v[0] == v[n-1])
return palindroma(v+1,n-1);
else return 0;
}
}

Grazie mille!!

7 Risposte

  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    Scusate, ovviamente mi sono dimenticato di dirvi che il linguaggio è C+, e che posso usare solo le array dato che le stringhe non si sono ancora fatte!
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    Ciao, il tuo codice non è molto "leggibile", per cui lo riscrivo un po più sintetico(correggimi se sbaglio):
    
    int palindroma(int *v, int n){
    
    if (n == 0 || n == 1)
    return 1;
    
    else{
    if (v[0] == v[n-1])                       
    return palindroma(v+1,n-1);
    else return 0;
    }
    }
    
    
    Perchè v+1? v è un array non una variabile, per cui come funziona?
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    Beh v[] è un array ma v si comporta come un puntatore a v[0] quindi aumentandolo di uno posso scorrere tutti gli elementi del vettore.
    Quindi nessuno sa dove ho sbagliato? =(
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    nicobatt ha scritto:


    beh v[] è un array ma v si comporta come un puntatore a v[0] quindi aumentandolo di uno posso scorrere tutti gli elementi del vettore.
    Quindi nessuno sa dove ho sbagliato? =(
    Giusto!! Allora l'errore semplicemente non c'è.
    Forse la utilizzi male, funziona, infatti, solo con array completi cioè con tutte le celle piene, dove n non è necessariamente il numero delle celle ma il numero di celle occupate.
    In quel caso, infatti, non c'è nessun errore.
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    Certo che l'errore c'e' .

    Pensa bene:

    usi due indici: 0 e n-1. Siano 'bgn=0' e 'end=n-1'.
    Quindi confronti v[bgn] con v[end]
    
    i t o p i n o n a v e v a n o n i p o t i
     ^ . . . . . . . . . . . . . . . . . . . ^
    
    ora i due caratteri sono uguali. Cosa devi fare? Spostare i due indici!
    
    i t o p i n o n a v e v a n o n i p o t i"
    . ^ . . . . . . . . . . . . . . . . . ^ .
    
    Capito l'inghippo?

    Consiglio: benche' il C/C++ permetta l'aritmetica dei puntatori, alla lunga, sopprattutto per mantenere il codice comprensibile, conviene non modificare mai il puntatore, ma utilizzare solo gli indici.

    Quindi, in questo caso, evitare l'espressione 'v+1': mooolto meglio, se proprio non se ne puo' fare ameno, usare '&v[1]'. E' molto piu' evidente quello che si sta' intendendo
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    Questo codice ti permette di non modificare il valore del puntatore usando un'altro parametro per la funzione, i sta a significare l'indice che aumenta ad ogni ripetizione...
    ps: si potrebbe non utilizzare il parametro n ma al suo posto ripetere più volte strlen... enjoy
    
    #include <iostream>
    using namespace std;
    int palindroma(char *v,int i, int n);
    
    int main(){
    	char s[100];
    	cin.getline(s,sizeof(s));
    	cout << "1 palindroma, 0 non palindroma: " << palindroma(s,0,strlen(s)) << endl;
    	system("pause");
    }
    
    int palindroma(char *v, int i, int n){
    if (n <= i)
    	return 1;
    else{
    	if (v[i] == v[n-1])                       
    		return palindroma(v,i+1,n-1);
    	else return 0;
    	}
    }
    
  • Re: Funzione ricorsiva per verificare se una parola è palindroma

    luigibana96 ha scritto:


    
    #include <iostream>
    using namespace std;
    int palindroma(char *v,int i, int n);
    
    int main(){
    	char s[100];
    	cin.getline(s,sizeof(s));
    	cout << "1 palindroma, 0 non palindroma: " << palindroma(s,0,strlen(s)) << endl;
    	system("pause");
    }
    
    int palindroma(char *v, int i, int n){
    if (n <= i)
    	return 1;
    else{
    	if (v[i] == v[n-1])                       
    		return palindroma(v,i+1,n-1);
    	else return 0;
    	}
    }
    
    Scusate la mia ignoranza, ma non è la stessa cosa? Intendo a livello di "va", "non va"?
    Ad ogni richiamo non succede questo?
    i t o p i n o n a v e v a n o n i p o t i
    ^ . . . . . . . . . . . . . . . . . . . ^
    i t o p i n o n a v e v a n o n i p o t i
      ^ . . . . . . . . . . . . . . . . . ^ .
    i t o p i n o n a v e v a n o n i p o t i
        ^ . . . . . . . . . . . . . . . ^ . .
    Ecc...
    Potete spiegarmi il perché non è corretto/uguale(anche perché ho fornito una risposta sbagliata e quindi voglio assolutamente capire)?
Devi accedere o registrarti per scrivere nel forum
7 risposte