2014-10-20 3 views
0

너는 n의 입력 값을 가지며 다이아몬드가 가질 행의 절반을 나타냅니다. 나는 다이아몬드의 전반을 만들 수 있었지만 나는 후반전에 좌절감을 느꼈다. 나는 그것을 얻을 수없는 것 같습니다. 나는 필요한 특정 코드를 물어 보려고 여기 온 것이 아니지만, 올바른 방향으로 나를 가리키며 이것을 작성하는 방법에 대한 팁이나 트릭을 줄 수 있습니까? 또한, 만약 내가이 프로그램에 대해 잘못된 길로 가고 있다면, 저에게 말해 주시고 프로그램에 어떻게 접근해야하는지 말해주십시오.루프가있는 다이아몬드 모양을 만드는 데 문제가 있습니다.

하단의 다이아몬드는 입력 5을 나타냅니다. n-1은 각 별표의 왼쪽에 공백을 나타냅니다. 도와 줘서 고마워!

public static void printDiamond(int n) 
    { 
    for(int i=0;i<n;i++) 
    { 
     for(int a=0;a<(n-(i+1));a++) 
     { 
      System.out.print(" "); 
     } 
     System.out.print("*"); 
     for(int b=0; b<(i*2);b++) 
     { 
      System.out.print("-"); 
     } 
     System.out.print("*"); 
     System.out.println(); 
    } 
} 
** What I need    ** What I have currently 
    *--*       *--* 
    *----*       *----* 
*------*      *------* 
*--------*      *--------* 
*--------* 
*------* 
    *----* 
    *--* 
    ** 
+1

그냥 제안입니다. 가장 위의'for'에서 모든 문장을 취하고 순서를 바꾸고 기존 코드 뒤에 추가하여 원하는 것을 얻을 수 없습니까? –

답변

1

그냥 루프를 역 :

for(int i=n-1;i>=0;i--) 
    { 
     for(int a=0;a<(n-(i+1));a++) 
     { 
      System.out.print(" "); 
     } 
     System.out.print("*"); 
     for(int b=0; b<(i*2);b++) 
     { 
      System.out.print("-"); 
     } 
     System.out.print("*"); 
     System.out.println(); 
    } 
2
public static void main(String[] args) { 
     int n = 10; 
     for (int i = 1 ; i < n ; i += 2) { 
      for (int j = 0 ; j < n - 1 - i/2 ; j++) 
       System.out.print(" "); 

      for (int j = 0 ; j < i ; j++) 
       System.out.print("*"); 

      System.out.print("\n"); 
     } 

     for (int i = 7 ; i > 0 ; i -= 2) { 
      for (int j = 0 ; j < 9 - i/2 ; j++) 
       System.out.print(" "); 

      for (int j = 0 ; j < i ; j++) 
       System.out.print("*"); 

      System.out.print("\n"); 
     } 
    } 

출력 이미 형성 절반 다이아몬드를 가지고 있기 때문에

 * 
    *** 
    ***** 
    ******* 
********* 
    ******* 
    ***** 
    *** 
    * 
1

, 단순히 루프 AGA를 실행 in, in reverse, 예 :

public static void printDiamond(int n) 
{ 
    for (int i = 0; i < n; i++) 
    { 
    for (int a = 0; a < (n - (i + 1)); a++) 
    { 
     System.out.print(" "); 
    } 
    System.out.print("*"); 
    for (int b = 0; b < (i * 2); b++) 
    { 
     System.out.print("-"); 
    } 
    System.out.print("*"); 
    System.out.println(); 
    } 

    for (int i = n-1; i >= 0; i--) 
    { 
    for (int a = 0; a < (n - (i + 1)); a++) 
    { 
     System.out.print(" "); 
    } 
    System.out.print("*"); 
    for (int b = 0; b < (i * 2); b++) 
    { 
     System.out.print("-"); 
    } 
    System.out.print("*"); 
    System.out.println(); 
    } 
} 
1

대칭을 볼 때마다 재귀가 내 머리에 울립니다. 나는 너와 다른 사람들이 더 많은 것을 배울 수있게 흥미롭게 만 게시하고있다. 처음 시작할 때 재귀를 이해하기가 더 어려울 수 있지만 이미 루프 기반 솔루션이 있으므로 재귀를 대조하면 장점과 단점이 명확하게 설명됩니다.

static int iteration = 0; 
public static void printDiamond(int n) { 
    int numberOfBlanks = n - iteration; 
    int numberOfDashes = iteration * 2; 
    String blank = new String(new char[numberOfBlanks]).replace("\0", " "); 
    String dash = new String(new char[numberOfDashes]).replace("\0", "-"); 
    String star = "*"; 
    String row = blank + star + dash + star + blank; 

    // printing the rows forward 
    System.out.println(row); 
    iteration++; 
    if (iteration < n) { 
     printDiamond(n); 
    } 
    // printing the rows backward 
    System.out.println(row); 
} 

첫째, 이상한 새로운 String과 혼동하지 마십시오 (새 문자 [numberOfBlanks : 그것은

재귀 솔루션을 :)으로 내 조언을 얻을 수있는 기회를 놓치지 마세요 ])). replace ("\ 0", ""); 반복되는 문자를 사용하여 문자열을 구성하는 자바의 깔끔한 트릭 예 : new String (new char [5]). replace ("\ 0", "+");은 다음 문자열을 생성합니다. +++++

재귀 비트가 설명됩니다. 두 번째 println은 재귀가 중지 될 때까지 실행되지 않습니다. 정지 기준은 반복으로 정의됩니다. < n. 그 지점까지 그 지점까지의 줄이 인쇄 될 것입니다. 그래서 이런 식으로 뭔가 : 재귀 정지 이상의

iteration 1. row =  **  
iteration 2. row = *--*  
iteration 3. row = *----* 
iteration 4. row = *------* 
iteration 5. row = *--------* 

하고, 나머지 코드는하지만 반대 순서로 실행됩니다. 그래서에만 두 번째에 println 인쇄하고,

continuing after 5 iteration row = *--------* 
continuing after 4 iteration row = *------* 
continuing after 3 iteration row =  *----* 
continuing after 2 iteration row =  *--*  
continuing after 1 iteration row =  ** 

을 다음과 같이 내가 그 뒤에 역학, 자원의 많음에 가지 않았다처럼 행 변수의 값이, 이것은 당신이 흥미를 얻기 위해 단지이다. 도움이 되었으면 좋겠습니다.

관련 문제