PDA

Visualizza la versione completa : [C] funzione ricorsiva


teoplc
22-09-2004, 19:20
Ciao che ve ne pare di questa funzioncina in termini di occupazione di memoria e di velocità di esecuzione...
la funzione ritorna 1 se la stringa è palindroma, 0 altrimenti...



#include <stdio.h>
#include <string.h>

int pal(char *str, char *p)
{
if(p<str)
return 1;
if(*str==*p)
return pal(++str,--p);
if(*str!=*p)
return 0;

};


int main(int argc, char **argv)
{
char str[20]="rrssrr";

if(pal(str,&str[strlen(str)-1]))
printf("Parola palindroma");
else
printf("Parola non palindroma");

getchar();
return 0;
}

Luc@s
22-09-2004, 19:25
int pal(char *str, char *p)
{
// controlliamo nn siano nulli
assert(str != NULL);
assert(str != p);
// controlliamo nn siano finiti
if(str == 0 || p == 0) return 0;
if(p<str) return 1;

if(*str==*p)return pal(++str,--p);

if(*str!=*p)return 0;

};



Cosi?

teoplc
22-09-2004, 19:28
Scusa ma perchè...non si possono confrontare due puntatori...

if(p<str) ?

quanti if hai fatto... :master:

_sys/sid
24-09-2004, 18:49
qualcuno riesce a fare la funzione che dice se una parola e' palindroma IN RICORSIVO passando solo la stringa ???

int palindroma (char *str);

unomichisiada
24-09-2004, 19:34
qualcuno riesce a fare la funzione che dice se una parola e' palindroma IN RICORSIVO passando solo la stringa ???

int palindroma (char *str);
Sei sicuro solo la stringa, o anche la lunghezza?
La stringa deve avere il terminatore,altrimenti,se non come si fa...fammi sapere che ci provo

_sys/sid
25-09-2004, 17:56
Una stringa e' una stringa perche' ha il terminatore '\0' alla fine...
altrimenti sarebbe solamente un vettore (array) di caratteri.

adarkar
26-09-2004, 01:47
Originariamente inviato da _sys/sid
qualcuno riesce a fare la funzione che dice se una parola e' palindroma IN RICORSIVO passando solo la stringa ???

int palindroma (char *str);

se passi solo la stringa allora credo sia necessario l'uso di variabili static altrimenti la func non ha abbastanza informazioni :bhò:

adarkar
26-09-2004, 01:48
Originariamente inviato da teoplc
Scusa ma perchè...non si possono confrontare due puntatori...

if(p<str) ?

quanti if hai fatto... :master:

:confused: :confused: :confused:

/dev/null
26-09-2004, 11:40
Se mi spiegate il significato di palindromo ci provo anch'io :zizi:




Uhm... Mi sono appena alzato, il cervello deve ancora partire, quindi la potrei sparare grossa :D
Ma il confronto tra 2 puntatori com'e' stato fatto li' che senso ha?
int * a, b;
a < b;Quest'istruzione non compara solamente l'indirizzo dei due puntatori? Quindi che senso ha in un programma cosi'?
Non ci vorrebbe ad esempio:
int * a, b;
*a < *b; :confused:

A meno che str e p siano della stessa stringa e vada fatto un controllo per sapere se siamo un carattere piu' avanti o piu' indietro.... E' questo il caso?

/dev/null
26-09-2004, 12:11
L'ho capito :yuppi:
Se c'e' qualche altro ignorantone come me che non sa cosa sia: http://www.splash.it/giochi/enigmistica/palindromo/

...Bhe'... Per farlo con la ricorsione passando una sola variabile un modo c'e', ma non so quanto sia corretto:
/*
* Si compila con
* gcc -o palindromo palindromo.c
*/

#include <stdio.h>
#include <string.h>

#define DIM 128
#define RICORSIVA 0
//#define ITERATIVA 1

int palindromo ( const char * par );

int main ( )
{
char parola [ DIM ];

while ( 1 ) {
printf ( "Inserisci una parola, ti diro' se e' un palindromo. (\"exit\" per uscire).\n" );
scanf ( "%s", parola );

if ( ! strcmp ( parola, "exit" ) )
break;

if ( palindromo ( parola ) )
printf ( "\"%s\" e' un palindromo.\n", parola );
else
printf ( "\"%s\" non e' un palindromo.\n", parola );
}

return 0;
}

int palindromo ( const char * par )
{
#ifdef RICORSIVA

char * parola = strdup ( par );
int lunghezza = strlen(parola);

if ( *parola == '\0' || *(parola+1) == '\0' )
return 1;

if ( *parola != *(parola+lunghezza-1) ) {
return 0;
} else {
*parola = '\0';
*(parola+lunghezza-1) = '\0';
return palindromo ( parola + 1 );
}

#elif defined ITERATIVA

/* vabbe', e' facile... */
return 0;

#endif
} http://forum.html.it/forum/faccine/pulp.gif http://forum.html.it/forum/faccine/pulp.gif http://forum.html.it/forum/faccine/pulp.gif http://forum.html.it/forum/faccine/pulp.gif http://forum.html.it/forum/faccine/pulp.gif http://linuxfromscratch.mentalslavery.org/phorum/smileys/rulla.gif


:ciauz:

Loading