Pagina 3 di 6 primaprima 1 2 3 4 5 ... ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 60

Discussione: [C] funzione ricorsiva

  1. #21
    Originariamente inviato da /dev/null
    Confronto tra puntatore e carattere
    quindi nn và propio bene farlo?darebbe errore?

    In ogni caso ecco una versione con i fix
    codice:
    int palindroma(char *parola){
     static int i=1;
     static int j;//le static vengono auto inizializzate,in questo caso a 0 essendo un intero
     
     //controllo che la stringa passata non sia nulla
     if(parola == NULL) return 0;
    
     //condizione di uscita della ricorsione
     if(i == strlen(parola)) return 1;
    
     if(parola[j] == parola[strlen(parola)-i] ){
      i++; 
      return palindroma(parola[++j]);
     }
    
    }
    cosi' è ok?


    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  2. #22
    no nn me la prendo.....almeno x me questo genere di post sono molto costruttivi
    Bene allora siamo in due,sono contento che esista ancora gente di buon senso.

    Cosa ne pensi esiste qualche modo per farlo senza informazioni "extrafunzione"?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #23
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da unomichisiada
    Si è concisa ed efficiente ma in questo modo avete in qualche modo "barato",infatti la funzione semplicemente salva in una locazione static l'informazione in più che gli serve invece di prenderla come parametro.
    Io ho provato a farlo senza questo tipo di sotterfugi (usare una variabile statica come voi o una variabile globale per la lunghezza l'ho scartato a priori come non risolutivo) e sono giunto alla conclusione che non è possibile farlo a meno di usare un array di appoggio in cui copiare ogni volta solo la sottostringa rimanente da parsare e passare quello alla successiva chiamata ricorsiva (ma così ciao ciao all'efficienza) .Spero che non ve la prendiate troppo per questa critica ma io la penso così.
    Anch'io sono giunto a questa conclusione
    Temo che l'unico modo sia quello che ho postato, ma, come hai detto, se va fatto con stringhe troppo lunghe oppure va eseguito spesso, consuma un botto di cpu e ram (la ram soprattutto nel primo caso: se si fa con stringe lunghe un mega - VVoVe: - ne vengono occupati almeno un centinaio in memoria, dato che le funzioni ricorsive continuano ad allocare sempre memoria per ogni ciclata)...
    Inoltre nel codice che ho postato mi sono anche scordato di dellocare la parola una volta duplicata
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  4. #24
    Anch'io sono giunto a questa conclusione
    Temo che l'unico modo sia quello che ho postato, ma, come hai detto, se va fatto con stringhe troppo lunghe oppure va eseguito spesso, consuma un botto di cpu e ram (la ram soprattutto nel primo caso: se si fa con stringe lunghe un mega - - ne vengono occupati almeno un centinaio in memoria, dato che le funzioni ricorsive continuano ad allocare sempre memoria per ogni ciclata)...
    Inoltre nel codice che ho postato mi sono anche scordato di dellocare la parola una volta duplicata
    Concordo senza riserve!!!
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #25
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da andrea_NET-_DSL
    quindi nn và propio bene farlo?darebbe errore?
    Eh si'...

    In ogni caso ecco una versione con i fix
    codice:
    int palindroma(char *parola){
     static int i=1;
     static int j;//le static vengono auto inizializzate,in questo caso a 0 essendo un intero
     
     //controllo che la stringa passata non sia nulla
     if(parola == NULL) return 0;
    
     //condizione di uscita della ricorsione
     if(i == strlen(parola)) return 1;
    
     if(parola[j] == parola[strlen(parola)-i] ){
      i++; 
      return palindroma(parola[++j]);
     }
    
    }
    cosi' è ok?

    No
    Li' passi un carattere al posto di un puntatore...

    Ho provato a metterci un & davanti ed eseguirlo, ma comunque non funziona :master:
    Prova ad compilarlo, cosi' proviamo ad aggiustare in qualche modo il problema che puo' venire eseguito solo una volta

    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  6. #26
    Originariamente inviato da /dev/null
    Eh si'...

    No
    Li' passi un carattere al posto di un puntatore...

    Ho provato a metterci un & davanti ed eseguirlo, ma comunque non funziona :master:
    Prova ad compilarlo, cosi' proviamo ad aggiustare in qualche modo il problema che puo' venire eseguito solo una volta

    sisi eccerto...che domande faccio ...un momento di confuzione

    tornando alla mia prima versione con il fix del confronto...
    codice:
    int palindroma(char *parola){
    static int i=1;
    static int j;//le static vengono auto inizializzate,in questo caso a 0 essendo un intero
    
    //controllo che la stringa passata non sia nulla
    if(parola == NULL) return 0;
    
    //condizione di uscita della ricorsione
    if(i == strlen(parola)) return 1;
    
    if(parola[j++] == parola[strlen(parola)-i] ){
    i++; 
    return palindroma(++parola);
    }
    
    }
    ok?ecceto il fatto che se la richiami +volte nel programma(cioè se vuoi controllare ad es due parole se sono palindrome,senza chiudere e riaprire il programma)casha, perchè c'è la var static che nn si resetta.

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  7. #27
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da andrea_NET-_DSL
    sisi eccerto...che domande faccio ...un momento di confuzione

    tornando alla mia prima versione con il fix del confronto...
    codice:
    int palindroma(char *parola){
    static int i=1;
    static int j;//le static vengono auto inizializzate,in questo caso a 0 essendo un intero
    
    //controllo che la stringa passata non sia nulla
    if(parola == NULL) return 0;
    
    //condizione di uscita della ricorsione
    if(i == strlen(parola)) return 1;
    
    if(parola[j++] == parola[strlen(parola)-i] ){
    i++; 
    return palindroma(++parola);
    }
    
    }
    ok?
    Non mi funzica :master:
    sia che gli passi "anna", sia che gli passi "ciao" mi restituisce 0...


    ecceto il fatto che se la richiami +volte nel programma(cioè se vuoi controllare ad es due parole se sono palindrome,senza chiudere e riaprire il programma)casha, perchè c'è la var static che nn si resetta.

    In C si puo' fare tutto
    Basta che prima di tutti i return di quella funzione ci si mette un bel
    codice:
    i = j = 0;
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  8. #28
    la variabile static si puo' riportare a 1 quando si trovano il return 0 e il return 1..
    Problema risolto o no ???

  9. #29
    ecco cosi' ho risolto il fatto della non corretta esecuzione di quella funzione più volte nello stesso programma
    codice:
    int palindroma(char *parola){
    static int i=1;
    static int j=0;
    
    //controllo che la stringa passata non sia nulla
    if(parola == NULL) return 0;
    
    //condizione di uscita della ricorsione
    if(i == strlen(parola)) {int i=1; j=0; return 1;}
    
    
    if(parola[j] == parola[strlen(parola)-i] ){
    ++i;
    ++j;
    return palindroma(++parola);
    }
    
    }
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  10. #30
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da andrea_NET-_DSL
    ecco cosi' ho risolto il fatto della non corretta esecuzione di quella funzione più volte nello stesso programma
    codice:
    int palindroma(char *parola){
    static int i=1;
    static int j=0;
    
    //controllo che la stringa passata non sia nulla
    if(parola == NULL) return 0;
    
    //condizione di uscita della ricorsione
    if(i == strlen(parola)) {int i=j=1; return 1;}
    
    
    if(parola[j] == parola[strlen(parola)-i] ){
    ++i;
    ++j;
    return palindroma(++parola);
    }
    
    }
    Quell'int non serve, se no dichiari una variabile locale all'interno di quell'if, e non modifichi il valore della variabile statica

    Comunque ancora non funziona
    Se lo eseguo, sia che gli passi "ciao", sia che gli passi "anna" mi rende sempre 0 :master:


    Scusa, ti sto facendo impazzire
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.