2015-11-30 13 views
5

Sto provando a creare un triangolo completo con qualsiasi input di testo. Esempio se ho stringa che è "ABCDEFGHIJ" Voglio che il risultato siaPiramide di testo che utilizza la ricorsione in Java

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

se la lunghezza della stringa è strano come in "ABCDEFGHIJ" allora l'uscita sarebbe

a 
    abi 
    abchi 
abcdghi 
abcdefghi 

Ecco quello che ho avere finora ma la mia uscita per le parole è capovolta. La mia uscita è

abcdefghij 
    abcdghij 
    abchij 
abij 
aj 

Quello che ho fatto finora

public static void main(String[] args) { 

     solve("abcdefghij"); 

    } 

    public static void solve(String word) { 

     solve(word, word.length()/2-1); 

    } 

    public static void solve(String word, int it) { 

     // print starting spaces 
     for(int i = 0; i < it; i++) 
      System.out.print(" "); 

     // print out string 
     System.out.print(word+"\n"); 


     if(word.length() > 2) { 

      int newlengthperside = (word.length() - 2)/2; 
      solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it-1); 

     } 
    } 

ho solo bisogno di un suggerimento su come iniziare da aj anziché alla fine. Grazie per qualsiasi aiuto. Questo è compito a casa quindi è apprezzato solo un suggerimento.

+6

Inizia con la stampa ** dopo ** la chiamata ricorrente per ripristinare l'ordine. – zubergu

+0

@zubergu - Peccato che non fosse una risposta, la risposta perfetta a una domanda relativa ai compiti. Non posso votare le risposte esistenti per essere una soluzione di codice per una domanda sui compiti, quindi farò +1 sul tuo commento. –

risposta

2

codice si dovrebbe guardare in questo modo:

public void solve(String str) { 
    for(int i=1;i<=str.length()/2;i++) { 
     for(int j=str.length()/2-i; j>0 ;j--) { 
      System.out.print(" "); 
     } 
     System.out.print(str.substring(0,i)); 
     System.out.print(str.substring(str.length()-i)); 
     System.out.println(); 
    } 
} 

ingresso:

"abcdefghij" 

uscita:

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

Questo copre solo il percorso felice, ma si mostrano capire la logica.


EDIT:

Per approccio ricorsivo:

public static void solve(String word) { 
    solve(word, 0); 
} 

public static void solve(String word, int it) { 

    // print starting spaces 
    String spaces=""; 
    for(int i = 0; i < it; i++) 
     spaces+=" "; 


    if(word.length() > 2) { 
     int newlengthperside = (word.length() - 2)/2; 
     solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it + 1); 
    } 
    System.out.print(spaces+word+"\n"); 
} 

ho cambiato un paio di cose: numero
1. conteggio degli spazi necessari e mettendoli in una stringa che viene usato in seguito.

String spaces=""; 
for(int i = 0; i < it; i++) 
    spaces+=" "; 
  1. risolvere (parola, 0); // -> 0 dalla lunghezza

  2. solve (word.substring (0, newlengthperside) + word.substring (word.length() - newlengthperside), it + 1); // -> aggiungendo 1 alla lunghezza

ingresso:

solve("abcdefghij"); 

uscita:

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 
+3

Credo che abbia bisogno di ricorrere alla ricorsione per risolvere questa domanda a casa (come nel titolo). – Foleosy

+1

Il mio male mancato! questo dovrebbe almeno dargli l'idea della logica. – StackFlowed

+1

@StackFlowed Grazie per l'aiuto ancora. Credo di poter provare a prendere l'algoritmo e applicarlo utilizzando la ricorsione. –

0

Swap vostro "// stampare stringa" linea con la vostra chiamata ricorsiva:

public static void solve(String word, int it) { 
    if(word.length() > 2) { 
     int newlengthperside = (word.length() - 2)/2; 
     solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it-1); 
    } 
    // print out string 
    System.out.print(word+"\n"); 
} 

Questo produrrà prima la stringa più breve, quando la funzione ritorna, produrrà la parola successiva più grande, e così via fino alla catena. Dovrai calcolare da solo la parte degli spazi, ma ciò dovrebbe darti un inizio (penso che il ciclo esistente posto tra le aree di ricorsione e "// stampa fuori stringa" funzionerà).

Problemi correlati