2010-04-26 42 views
6

Tôi cần phải viết một phương thức được gọi là printTriangle(5);. Chúng ta cần tạo một phương thức lặp và phương thức đệ quy (không có bất kỳ sự lặp lại nào). Đầu ra cần phải có dạng như sau:Tạo một hình tam giác ra khỏi các ngôi sao chỉ sử dụng đệ quy

* 
** 
*** 
**** 
***** 

Mã này hoạt động với tính lặp lại nhưng tôi không thể điều chỉnh nó để đệ quy.

public void printTriangle (int count) { 
    int line = 1; 
    while(line <= count) { 
     for(int x = 1; x <= line; x++) { 
      System.out.print("*"); 
     } 
     System.out.print("\n"); 
     line++; 
    } 
} 

Tôi cần lưu ý rằng bạn không thể sử dụng bất kỳ biến cấp lớp hoặc bất kỳ phương pháp bên ngoài nào.

+8

Đây có phải là một bài tập về nhà? –

+1

Dấu cách không phải là ký tự hợp lệ trong tên phương thức Java. Bạn sẽ phải gọi nó là 'like_printTriangle (5)' – mob

+0

@DJ. Vâng. Đây là lần đầu tiên trong 22 chương tôi gặp bất kỳ vấn đề gì. @mobrule: Điều đó có liên quan gì với mọi thứ? Một điều tôi đã thử là sử dụng chuỗi định dạng, nhưng có vẻ như Java không hỗ trợ các ký tự đệm tùy chỉnh. –

Trả lời

12

Lưu ý trong cách tiếp cận lặp lại của bạn mà bạn có hai quầy: đầu tiên là dòng bạn đang ở trên line và thứ hai là vị trí trên dòng bạn đang ở trên x. Bạn có thể tạo hàm đệ quy lấy hai tham số và sử dụng chúng làm các bộ đếm lồng nhau, yx. Khi bạn giảm x cho đến khi nó đạt 0, sau đó giảm y và đặt x = y, cho đến khi cả x và y là 0.

Bạn cũng có thể nhận thấy rằng mỗi dòng kế tiếp trong tam giác là dòng trước cộng với một dấu sao. Nếu hàm đệ quy của bạn trả về một chuỗi các dấu sao cho dòng trước đó, dòng tiếp theo luôn là chuỗi đó cộng thêm một dấu sao nữa. Vì vậy, mã của bạn sẽ là một cái gì đó như:

public String printTriangle (int count) { 
    if(count <= 0) return ""; 

    String p = printTriangle(count - 1); 
    p = p + "*"; 
    System.out.println(p); 

    return p; 
} 
+1

wow.Tôi không thể tin rằng tôi đã không nghĩ về điều đó.Tôi nghĩ rằng đã bị ném ra bởi vì tôi giả định rằng đã phải trả lại vô hiệu vì nó không có ý nghĩa để trả lại bất cứ điều gì.Công việc tốt và cảm ơn! Ngoài ra, giải thích tuyệt vời –

+0

+1 Đây là solu đúng sự. Rất thông minh! :-) Một cải tiến không liên quan: hai câu lệnh in có thể được thay thế bằng một 'System.out.println (p);' –

+0

tốt đẹp. và +1 prof cho một câu hỏi tốt :) –

2

Bạn có thể chuyển đổi một vòng lặp để một hàm đệ quy như thế này:

void printStars(int count) { 
    if (count == 0) return; 

    System.out.print("*"); 
    printStars(count - 1); 
} 
printStars(5); //Prints 5 stars 

Bạn sẽ có thể để thực hiện một chức năng tương tự để in dòng.

+1

in ra 1 dòng. nhiệm vụ là cho toàn bộ tam giác trong 1 phương pháp. Đó là lý do tại sao nó gây nhầm lẫn cho tôi. –

+6

Bạn vẫn có thể thả khóa học? – WhirlWind

+1

sau đó bạn chỉ cần tìm ra nơi để in ngắt dòng –

3

Ví dụ trong python (chỉ vì lợi ích của mẫu, nhưng tôi hy vọng ý tưởng được thông qua):

#!/usr/bin/env python 

def printTriangle(n): 
    if n > 1: 
     printTriangle(n - 1) 
    # now that we reached 1, we can start printing out the stars 
    # as we climb out the stack ... 
    print '*' * n 

if __name__ == '__main__': 
    printTriangle(5) 

Output trông như thế này:

$ python 2717111.py 
* 
** 
*** 
**** 
***** 
+2

Tôi nghi ngờ rằng điều đó sẽ được coi là lặp lại. – SLaks

+0

Mặc dù hợp lệ, điều này không giúp ích nhiều cho java :) –

2

Bạn cũng có thể làm điều đó với một đơn đệ quy (không thanh lịch) như sau:

public static void printTriangle (int leftInLine, int currLineSize, int leftLinesCount) { 
    if (leftLinesCount == 0) 
     return; 
    if (leftInLine == 0){ //Completed current line? 
     System.out.println(); 
     printTriangle(currLineSize+1, currLineSize+1, leftLinesCount-1); 
    }else{ 
     System.out.print("*"); 
     printTriangle(leftInLine-1,currLineSize,leftLinesCount); 
    } 
} 

public static void printTriangle(int size){ 
    printTriangle(1, 1, size); 
} 

Ý tưởng là các tham số phương pháp đại diện cho đồng trạng thái vẽ mplete.

Lưu ý rằng kích thước phải lớn hơn 0.

+0

Vì lợi ích của sự hiểu biết đệ quy đơn giản, nó có thể được rõ ràng hơn để sử dụng một phương pháp trợ giúp đệ quy để in mỗi dòng. Điều này cũng hoạt động. :) –

+0

Cảm ơn, công trình này. Tôi sợ tôi có thể phải đi một phương pháp đối số nhiều vì giáo sư của tôi vẫn nói với tôi rằng các phương pháp quá tải xấu là như thế nào (tôi nghĩ nó khá hữu dụng). Tôi hy vọng anh ấy chấp nhận điều này. @Justin là HAS là một phương pháp. Điều này kéo dài nhưng nó đủ gần. –

-1

Tôi nghĩ rằng điều này sẽ hoạt động ... chưa được kiểm tra khỏi đầu của tôi.

public void printTriangle(int count) 
{  
    if (count == 0) return; 
    printTriangle(count - 1); 
    for (int x = 1; x <= count; x++) { 
     System.out.print("*"); 
    } 
    System.out.print("\n"); 
} 
+0

Điều này sử dụng lặp lại. –

+1

cool logo man. !! –

+0

-1 OP đã yêu cầu ** một phương thức đệ quy (không có bất kỳ sự lặp lại nào) **. –

0

Bạn có thể làm điều đó như thế này:

Method lấy số lượng của các ngôi sao như một tham số. Hãy gọi nó là n.

Sau đó, nó:

  1. cuộc gọi riêng của mình một cách đệ quy với n-1.

  2. in một dòng có n sao.

Hãy chắc chắn để làm gì nếu n == 0.

+0

In phù hợp với sao n liên quan đến việc lặp đi lặp lại trừ khi được định nghĩa đệ quy cách riêng biệt. –

-1

Vì vậy, bạn cần phải tạo ra một khối nhỏ. Cần chặn thông tin gì? Chỉ tối đa. Nhưng đệ quy cần phải biết những gì dòng của nó trên ...bạn kết thúc với một constructor như:

public void printTriangle (int current, int max) 

Bây giờ, sử dụng đó để đưa phần còn lại của đệ quy với nhau:

public void printTriangle (int current, int max) 
{ 
    if (current <= max) 
    { 
     // Draw the line of stars... 
     for (int x=0; x<current; x++) 
     { 
      System.out.print("*") 
     } 
     // add a newline 
     System.out.print("\n"); 

     // Do it again for the next line, but make it 1-bigger 
     printTriangle(current + 1, max); 
    } 
} 

Bây giờ, tất cả các bạn phải làm, được khởi xướng nó:

printTriangle(1, 5); 
+0

nhưng nó có lặp. nó cần phải hoàn toàn không có sự lặp lại –

+0

. Điều này bao gồm sự lặp lại. –

+0

Ah .. nhỡ phần đó. Trong trường hợp đó, bạn sẽ chỉ cần có một chức năng lặp thứ hai ... mặc dù cái được đánh dấu là "trả lời" là khá darned thông minh – Jerry

0
package playground.tests; 

import junit.framework.TestCase; 

public class PrintTriangleTest extends TestCase { 
    public void testPrintTriangle() throws Exception { 
     assertEquals("*\n**\n***\n****\n*****\n", printTriangleRecursive(5, 0, 0)); 
    } 

    private String printTriangleRecursive(int count, int line, int character) { 
     if (line == count) 
      return ""; 
     if (character > line) 
      return "\n" + printTriangleRecursive(count, line + 1, 0); 
     return "*" + printTriangleRecursive(count, line, character + 1); 
    } 

} 
0
void trianglePrint(int rows){ 
      int static currentRow = 1; 
      int static currentStar = 1; 

      // enter new line in this condition 
      // (star > currentrow) 

      if (currentStar > currentRow){ 
       currentStar = 1; 
       currentRow++; 
       cout << endl; 
      } 

      if (currentRow > rows){ 
       return; // finish 
      } 

      cout << "*"; 
      currentStar++; 

      trianglePrint(rows); 
     } 
+0

thực sự, Đây là trong C++: ") –

+0

bạn có thể sử dụng cùng một khái niệm với bất kỳ ngôn ngữ nào khác;) –

Các vấn đề liên quan