2015-11-30 18 views
5

Herhangi bir metin girişi ile tam bir üçgen yapmaya çalışıyorum. Örnek I olan dize varsa istiyoruz "ABCDEFGHIJ" dize uzunluğu "ABCDEFGHIJ" örneğinde olduğu gibi tek ise sonuçJava'da yineleme kullanarak Metin Piramit

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

olmak sonra çıkış

İşte
a 
    abi 
    abchi 
abcdghi 
abcdefghi 

ne olduğunu olurdu ben şimdiye kadar var ama kelimeler için çıkışım baş aşağı. Benim çıkış ben

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); 

     } 
    } 

Sadece sonu yerine aj başlamak için nasıl bir öneri ihtiyaç şimdiye kadar ne yaptın

abcdefghij 
    abcdghij 
    abchij 
abij 
aj 

olduğunu. Herhangi bir yardım için teşekkürler. Bu ödevdir, bu yüzden sadece bir ipucu takdir edilir.

+6

Baskıdan sonra ** tekrarlayan çağrıya geri dönme sırası ile başlayın. – zubergu

+0

@zubergu - Yazık bu bir cevap değildi, ev ödevi ile ilgili bir soruya mükemmel cevap. Bir ev ödevi sorusuna kod çözümleri olmak için mevcut cevapları oylayamıyorum, bu yüzden yorumunuzu + 1'leyeceğim. –

cevap

2

Kodun bu gibi görünmelidir:

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(); 
    } 
} 

Girdi:

"abcdefghij" 

Çıktı:

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

Bu yalnızca mutlu yolunu kapsar ama mantığını anlamak göstermektedir.


DÜZENLEME: özyinelemeli yaklaşım için

:
1. sayma gerekli alanların sayısı ve sonradan kullanılan bir dizede koyarak:
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"); 
} 

bir kaç şey değişti.

String spaces=""; 
for(int i = 0; i < it; i++) 
    spaces+=" "; 
  • çözmek

      (kelime, 0); // -> 0 uzunluktan

    1. çözmek (word.substring (0, newlengthperside) + word.substring (word.length() - newlengthperside), it + 1); // -> uzunluğuna 1 ekleyerek

    Girdi:

    solve("abcdefghij"); 
    

    Çıktı:

    aj 
        abij 
        abchij 
    abcdghij 
    abcdefghij 
    
  • +3

    Bu ev ödevi sorusunu çözmek için yinelemeyi kullanması gerektiğine inanıyorum (başlıkta olduğu gibi). – Foleosy

    +1

    Benim hatam bunu kaçırdı! Bu en azından mantık fikrini vermelidir. – StackFlowed

    +1

    @StackFlowed Hala yardımcı olduğunuz için teşekkür ederiz. Algoritmayı alıp özyinelemeyle uygulayabileceğime inanıyorum. –

    0

    Swap senin "// dize çıktısını" senin özyinelemeli çağrı ile çizgi:

    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"); 
    } 
    

    Bu en kısa dizeyi ilk olarak gönderir. en işlev döndüğünde, bir sonraki en büyük sözcüğü ve böylece zinciri açacaktır. Boşluk kısmını kendiniz halletmeniz gerekecek, fakat bu size bir başlangıç ​​vermelidir (Bence özyineleme ile "// print out string" alanları arasına yerleştirilen mevcut döngü).