Difference between revisions of "Palindroma"

From Sistemi Operativi
Jump to navigation Jump to search
m
Line 45: Line 45:
  
 
#ifdef REC
 
#ifdef REC
 +
int recpali(char s[], int i, int f){
 +
        if (i>=f)
 +
                return 1;
 +
        else if (s[i]!=s[f])
 +
                return 0;
 +
        else
 +
                return recpali(s, i+1, f-1);
 +
}
 +
 +
int palindroma(char s[]){
 +
        return recpali(s, 0, strlen(s)-1);
 +
}
 +
 
int palin(char s[], int i, int f){
 
int palin(char s[], int i, int f){
 
if (s[i]!=s[f])
 
if (s[i]!=s[f])
Line 81: Line 94:
 
(ovviamente mutatis mutandis, se il vostro sorgente non si chiama pali come il mio)
 
(ovviamente mutatis mutandis, se il vostro sorgente non si chiama pali come il mio)
  
Chi ha voglia di fare una soluzione iterativa in Python e ricorsiva in C?
+
Patti aveva proposto questa soluzione ricorsiva in C:
 +
<syntaxhighlight lang="C">
 +
int palin(char s[], int i, int f){
 +
if (s[i]!=s[f])
 +
return 0;
 +
if (i>=f)
 +
return 1;
 +
return palin(s, i+1, f-1);
 +
}
 +
 
 +
int palindroma(char s[]){
 +
if (strlen(s)<2)
 +
return 1;
 +
return palin(s, 0, strlen(s)-1);
 +
}
 +
</syntaxhighlight>
 +
(era dentro l'ifdef REC sopra).
 +
L'ho leggermente migliorata in due aspetti:
 +
* e' buona cosa nella ricorsione controllare il caso base (caso di uscita) come prima operazione. Come vedete questo consente qui di eliminare il controllo prima della chiamata palin (che ho ridenominato recpali).
 +
* e' sempre bene indicare esplicitamente l'else agli if anche in caso di return. Cosi' il codice e' piu' leggibile.
 +
 
 +
Chi ha voglia ora di proporre una soluzione iterativa in Python?

Revision as of 08:16, 30 October 2013

Visto che qui non succede nulla, inizio io:

Ecco una implementazione in python3... chi mi propone altre soluzioni alternative?

#!/usr/bin/env python3

def palindrome(x):
  if len(x) < 2: return True
  else:
    if x[0] == x[-1]:
      return palindrome(x[1:-1])
    else:
      return False

if __name__ == "__main__":
  s=input("type in a string: ")
  print("is {} palindrome? {}".format(s,"true" if palindrome(s) else "false"))

Domenique ha proposto questa funzione in C:

int palindroma(char *pnt){

	int dim=strlen(pnt)-1;
	int l=dim/2;
	int k;

	for(k=0;k<=l;k++)
	{ 
		if(pnt[k]!=pnt[dim])
			return 0;
		else
			dim--;	  						
	}
        return 1;
}

altre proposte? Cosa ne dite di questa soluzione?

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

#ifdef REC
int recpali(char s[], int i, int f){
        if (i>=f)
                return 1;
        else if (s[i]!=s[f])
                return 0;
        else
                return recpali(s, i+1, f-1);
}
 
int palindroma(char s[]){
        return recpali(s, 0, strlen(s)-1);
}

int palin(char s[], int i, int f){
	if (s[i]!=s[f])
		return 0;
	if (i>=f)
		return 1;
	return palin(s, i+1, f-1);
}

int palindroma(char s[]){
	if (strlen(s)<2)
		return 1;
	return palin(s, 0, strlen(s)-1);	
}
#else
int palindroma(char *s) {
        char *t;
        for (t=s+(strlen(s)-1); s < t; s++, t--)
                if (*t != *s) return 0;
        return 1;
}
#endif


#ifdef DEBUGMAIN
int main(int argc, char *argv[])
{
        if (argc < 2) return -1;
        printf("%s: %se\' una stringa palindroma\n",argv[1],palindroma(argv[1])?"":"non ");
}
#endif

per compilare il main di prova chiamate il compilatore con il comando seguente

   gcc -DDEBUGMAIN -o pali pali.c

(ovviamente mutatis mutandis, se il vostro sorgente non si chiama pali come il mio)

Patti aveva proposto questa soluzione ricorsiva in C:

int palin(char s[], int i, int f){
	if (s[i]!=s[f])
		return 0;
	if (i>=f)
		return 1;
	return palin(s, i+1, f-1);
}

int palindroma(char s[]){
	if (strlen(s)<2)
		return 1;
	return palin(s, 0, strlen(s)-1);	
}

(era dentro l'ifdef REC sopra). L'ho leggermente migliorata in due aspetti:

  • e' buona cosa nella ricorsione controllare il caso base (caso di uscita) come prima operazione. Come vedete questo consente qui di eliminare il controllo prima della chiamata palin (che ho ridenominato recpali).
  • e' sempre bene indicare esplicitamente l'else agli if anche in caso di return. Cosi' il codice e' piu' leggibile.

Chi ha voglia ora di proporre una soluzione iterativa in Python?