Ricorsione (verifica universale)

di il
9 risposte

Ricorsione (verifica universale)

Salve,
premetto che la ricorsione non è il mio forte infatti ho scritto questo metodo in cui non riesco a capire l'errore.

Quello che dovevo fare era scrivere un metodo ricorsivo che mi controllasse se in una stringa fossero presenti SOLO caratteri maiuscoli e quindi restituire true, false altrimenti.

Io ho scritto questo:
import fiji.io.*;
 class CONTROLLOricorsione{ 

public static boolean controllo(String s){
 
if(s.length()==0)
 return false;
 if(Character.isLowerCase(s.charAt(0)))
 return false;
 else return controllo(s.substring(1,s.length()));
 }

 public static void main(String[] args){
 String s;

 System.out.println("Inserisci stringa");
 s=Lettore.in.leggiString();
 System.out.println(controllo(s));
 } }
Il programma gira ma mi da "true" anche solo con una lettera maiuscola...
Suggerimenti? grazie.

9 Risposte

  • Re: Ricorsione (verifica universale)

    .
  • Re: Ricorsione (verifica universale)

    Sicuro che non debba ritornare true?
    
    if(s.length()==0)
    return false;
  • Re: Ricorsione (verifica universale)

    Questo
    s.substring(1,s.length())
    Può essere scritto così
    s.substring(1)
  • Re: Ricorsione (verifica universale)

    ale99 ha scritto:


    Sicuro che non debba ritornare true?
    
    if(s.length()==0)
    return false;
    No li torna false perchè una stringa lunga zero non é composta tutta da maiuscole.
    Si la cosa del substring è vera grazie!

    Per il resto sto come prima
  • Re: Ricorsione (verifica universale)

    Qui credo ti sbagli:

    Cosa fa terminare la ricorsione?
    Quando la ricorsione termina, quanto è lunga la stringa?
    Cosa viene ritornato nell'ultimo passaggio della ricorsione?
  • Re: Ricorsione (verifica universale)

    Per quello che avevo pensato io la ricorsione termina appena al metodo viene assegnata una substring di s che abbia come primo carattere una lettera minuscola perché
    if(Character.isLowerCase(s.charAt(0)))
    return false;
    poi se questo non è verificato di quella stringa o substringa mi fai lo stesso ragionamento partendo dal carattere successivo perchè
    controllo(s.substring(1,s.length()))
    ma evidentemente è sbagliato
  • Re: Ricorsione (verifica universale)

    Per quello che avevo pensato io la ricorsione termina appena al metodo viene assegnata una substring di s che abbia come primo carattere una lettera minuscola
    Questo è corretto
    poi se questo non è verificato di quella stringa o substringa mi fai lo stesso ragionamento partendo dal carattere successivo
    Anche questo è corretto

    Prova a scrivere e testare su carta l'algoritmo.
    Noterai che ogni volta che la stringa è lunga 0 ritorna false.
    Ma se
    verificato di quella stringa o substringa mi fai lo stesso ragionamento partendo dal carattere successivo
    ci sarà un momento in cui la stringa è lunga 0 e quindi la funzione termina ritornando false perchè
    li torna false perchè una stringa lunga zero non é composta tutta da maiuscole.
    Quindi la funzione restituisce false quando trova una minuscola perchè
    la ricorsione termina appena al metodo viene assegnata una substring di s che abbia come primo carattere una lettera minuscola
    o la stinga è terminata.
    Ma allora quando ritorna true?



    Codice funzionante
    import java.io.*;
    import java.util.Scanner;
    
    public class Main {
    
        public static boolean controllo(String s) {
    
            if (s.length() == 0) {
                return true;
            }
            if (Character.isLowerCase(s.charAt(0))) {
                return false;
            } else {
                return controllo(s.substring(1));
            }
        }
    
        public static void main(String[] args) {
            String s;
    
            System.out.println("Inserisci stringa");
            
            Scanner scanner = new Scanner(System.in);
            
            s = scanner.nextLine();
            
            System.out.println("Digitato : "+s);
            
            System.out.println(controllo(s));
        }
    
    }
    
  • Re: Ricorsione (verifica universale)

    Dovrebbe tornare true quando non trova neanche una minuscola solo che se io scrivo una stringa del tipo:

    sghagaGgha

    ritorna true quando invece si sarebbe dovuto fermare alla prima lettera minuscola dandomi false.

    se gli passo una con tutte minuscole torna false.
  • Re: Ricorsione (verifica universale)

    Comunque problema risolto questa può essere una soluzione
    
    
    public static boolean tutteMaiuscole(String s){
    
    boolean res;
    if (s.length() = 0) 
    res = true;
    else
    res = ( (maiuscola(s.charAt(0)) && tutteMaiuscole(s.substring(1) );
    return res;
    } 
    col metodo maiuscola che supporta la causa

    (non avevo notato la soluzione di ale99)
Devi accedere o registrarti per scrivere nel forum
9 risposte