PDA

View Full Version : Pascal e ricorsione...


marcus81
27-11-2002, 19:06
Come creare una funzione ricorsiva in pascal per testare se una parola è palindroma?

Jayant
28-11-2002, 00:41
Originariamente inviato da marcus81
[B]Come creare una funzione ricorsiva in pascal per testare se una parola è palindroma?

Almeno questo cerca di impararlo da solo:D

marcus81
28-11-2002, 09:01
Grazie moolto gentile!:D

recoil
29-11-2002, 18:22
per vedere se una parola è palindroma io non userei una ricorsione...

cmq, potresti tentare qualcosa di simile:

calcola(i,n)

dove i è l'indice che va da 1 in avanti e n è la lunghezza della parola... ad ogni passo della ricorsione tu controlli se i+1 è palindroma, fino a che la i non è arrivata a n/2.

cionci
29-11-2002, 19:34
Se per definizione una parola di una sola lettera e la stringa vuota sono palindrome...basta fare una cosa del genere :

(non mi ricordo la sintassi del Pascal...lo scrivo in uno pseudo-codice)

palindroma (parola)
begin
se (lunghezza(parola) < 2)
ritorno vero;
se (parola[0] è diversa da parola [indice ultima lettera])
ritorno falso;
da parola tolgo la prima e l'ultima lettera
ritorno palindroma(parola);
end


In C farei così:

int palindroma(char *parola)
{
if(strlen(parola) < 2)
return 0;
if(parola[0] != parola[strlen(parola) - 1])
return 0
parola[strlen(parola) - 1] = '\0';
return palindroma(parola + 1);
}
//PS: questo codice è distruttivo per la parola

gokan
29-11-2002, 20:37
Come al solito Cionci si esprime meglio in C che in linguaggio normale:D :D :D

cionci
29-11-2002, 20:48
La devo prendere come offesa o come complimento ? :rolleyes: :D :D

marcus81
29-11-2002, 21:45
complimento,complimento...sei il mago del C!

cmq io ho fatto così:

function palindr2(i,j:integer): boolean;
begin
palindr2:=true;
if (i>=1) then begin
palindr2(i-1,j+1);
if (stringa[i]<>stringa[j]) then
palindr2:=false;
end;
end;

function palindr1(n:integer): boolean;
var i,j:integer;

begin
if (n mod 2) <> 0 then begin
i:=n div 2;
j:=(n div 2) + 2;
end

else begin
i:=n div 2;
j:=n div 2 + 1;
end;

if (palindr2(i,j)) then
palindr1:=true
else palindr1:=false;

end;

"n" è la lunghezza della parola, la funzione chiamata dal programma è palindr1...

lo so è un po' incasinato però funziona...cionci nn mi sparare!:D

cionci
30-11-2002, 00:13
Sai come si ottiene una sottostringa da una stringa in Pascal ? E la lunghezza di una stringa ?

Ma stringa è globale ? In questi casi le variaibli globali sono bruttine ;)

gokan
30-11-2002, 10:51
Originariamente inviato da cionci
[B]La devo prendere come offesa o come complimento ? :rolleyes: :D :D

E' un complimento ovviamente:p

marcus81
30-11-2002, 11:59
Si, stringa è un array globale...
La lunghezza della stringa è calcolata nel programma principale attraverso un ciclo while(nn ricordavo la funz. predefinita)...
Nn so se ci sia qualke funzione predefinita per estrarre una sottostringa...
Cmq funziona bene!;)

marcus81
30-11-2002, 12:01
X cionci:

Hai qualke suggerimento x compattare il codice?

cionci
30-11-2002, 12:16
function palindr(i,j:integer): boolean;
begin
palindr:=false;
if (i>=1 and j>=i) then
begin
if (stringa[i]=stringa[j]) then
begin
if (i=j or j=i-1) then
palindr:=true;
else
palindr:=palindr(i+1, j-1);
end;
end;
end;

Dovrebbe bastare questa...
Basta chiamarla con palindr(1,n);

PS: non sono sicuro del codice... Non mi ricordo molto Pascal !!!

marcus81
30-11-2002, 12:41
function palindr(i,j:integer): boolean;
begin
palindr:=false;
if ((i>=1) and (j>=i)) then
begin
if (stringa[i]=stringa[j]) then
begin
if ((i=j) or (j=i+1)) then
palindr:=true
else
palindr:=palindr(i+1, j-1);
end;
end;
end;

ho fatto qualke piccolissima modifica al tuo codice...funziona benissimo,grazie ancora!;)

cionci
30-11-2002, 18:19
i+1...vero...avevo confuso la i con la j ;)