Soluzione 6.4

Ecco una possibile soluzione. Studiare con attenzione il funzionamento del metodo ricorsivo getSubstrings.
public class RecSubstringGenerator
{
    public static void main(String[] args)
    {
        if (args.length != 1)
        {
            System.out.println("uso: $java RecSubstringGenerator ");
            System.exit(1);
        }

        String[] sub = getSubstrings(args[0]);
        for (int i = 0; i < sub.length; i++)
            System.out.println(sub[i]);
    }


    private static String[] getSubstrings(String s)
    {
        if (s.length() < 2)        // caso base: stringa nulla o di lunghezza 1
            return new String[] {s};

        /*
            costruisco l'insieme substrings come unione di due insiemi,
            substrings1 e substrings2. Il primo e` l'insieme delle sottostringhe
            che contengono il primo carattere, il secondo e` l'insieme delle
            sottostringhe che _non_ contengono il primo carattere.
        */
        String[] substrings1 = new String[s.length()];
        for (int i = 0; i < s.length(); i++)     // sottostringhe che contengono
            substrings1[i] = s.substring(0, i+1);// il primo carattere

        //passo ricorsivo: sottostringhe che non contengono il primo carattere.
        String[] substrings2 = getSubstrings(s.substring(1));

        // costruzione dell'insieme unione dei due sottoinsiemi
        String[] substrings = new String[substrings1.length+substrings2.length];

        for (int i = 0; i < substrings1.length; i++)
            substrings[i] = substrings1[i];
        for (int i = 0; i < substrings2.length; i++)
            substrings[substrings1.length + i] = substrings2[i];

        return substrings;
    }
}