Soluzione 6.5

La soluzione ricorsiva al problema e` la seguente: Il codice qui riportato include un metodo isPalindrome che fornisce una soluzione all'esercizio base, e un metodo isPalindrome2, che fornisce una soluzione all'approfondimento.
public class RecPalindromeTester
{
    public static void main(String[] args)
    {
        if (args.length != 1)
        {
            System.out.println("Uso: $java RecPalindromeTester ");
            System.exit(1);
        }

        if(isPalindrome2(args[0]))
        {
            System.out.println("E` una frase palindroma!");
            if(isPalindrome(args[0]))
                System.out.println("Ed e` anche una stringa palindroma!!");
            else
                System.out.println("Ma non e` una stringa palindroma...");
        }
        else
            System.out.println("Non e` una frase/stringa palindroma...");
    }

    //metodo ricorsivo che verifica se s e` una stringa palindroma
    private static boolean isPalindrome(String s)
    {
        if (s == null)
            throw new IllegalArgumentException();

        int length = s.length();
        if (length < 2)
            return true;
        if (s.charAt(0) != s.charAt(length - 1))
            return false;

        String ss = s.substring(1, length - 1);
            return isPalindrome(ss);
    }

    //metodo ricorsivo che verifica se s e` una "frase palindroma", ovvero se e`
    //una stringa palindroma trascurando differenze maiuscole/minuscole, spazi e
    //altri delimitatori, segni di punteggiatura
    private static boolean isPalindrome2(String s)
    {
        if (s == null)
            throw new IllegalArgumentException();

        int length = s.length();
        if (length < 2)
            return true;

        char first = Character.toLowerCase(s.charAt(0));
        char last =  Character.toLowerCase(s.charAt(length - 1));

        String ss = null;
        if (Character.isLetter(first) && Character.isLetter(last))
        {
            if (first  != last)
                return false;
            else
                ss = s.substring(1, length - 1);
        }
        else if (!Character.isLetter(first))
            ss = s.substring(1, length);
        else 
            ss = s.substring(0, length -1);

        return isPalindrome2(ss);
    }
}