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

ให้น้อง ๆ ลองสังเกต pattern ของรูปนี้ดู ว่าเป็นยังไง จะได้ว่า

  • แถว 1 -> เว้นวรรค 4 ช่อง แล้ว print 1 *
  • แถว 2 -> เว้นวรรค 2 ช่อง แล้ว print 3 *
  • แถว 3 -> เว้นวรรค 0 ช่อง แล้ว print 5 *
  • แถว 4 -> เว้นวรรค 2 ช่อง แล้ว print 3 *
  • แถว 5 -> เว้นวรรค 4 ช่อง แล้ว print 1 *

จะเห็นได้ว่า pattern นี้มีทั้งหมด 5 แถว และสามารถแบ่งออกเป็น 2 ส่วนได้

ส่วนบน
แถว 1 -> 1 *
แถว 2 -> 3 *
แถว 3 -> 5 *

ส่วนล่าง
แถว 4 -> 3 *
แถว 5 -> 1 *

ดังนั้นรูปนี้จริง ๆ แล้วคือการเอา pattern 2 อันมาต่อกัน

1. สามเหลี่ยมบน ที่จำนวน * เพิ่มขึ้น
2. สามเหลี่ยมล่าง ที่จำนวน * ลดลง

ส่วนที่ 1 สามเหลี่ยมบน

ก่อนอื่นเราจะเริ่มจากครึ่งบนก่อน

    *
  * * *
* * * * *

ให้น้อง ๆ สังเกตว่า

row = 1 -> เว้นวรรค 4 ช่อง แล้ว print 1 *
row = 2 -> เว้นวรรค 2 ช่อง แล้ว print 3 *
row = 3 -> เว้นวรรค 0 ช่อง แล้ว print 5 *

ถ้าให้ n = 3 แทนจำนวนแถวของครึ่งบน เราจะได้ว่า

จำนวนช่องว่าง = 2 * (n - row)
จำนวน * = 2 * row - 1

ลองแทนค่าดู

row = 1 -> ช่องว่าง = 2 * (3 - 1) = 4, ดาว = 2 * 1 - 1 = 1
row = 2 -> ช่องว่าง = 2 * (3 - 2) = 2, ดาว = 2 * 2 - 1 = 3
row = 3 -> ช่องว่าง = 2 * (3 - 3) = 0, ดาว = 2 * 3 - 1 = 5

ดังนั้นโค้ดของครึ่งบนจะเป็น

int n = 3;

for (int row = 1; row <= n; row++) {
    for (int space = 1; space <= 2 * (n - row); space++) {
        System.out.print(" ");
    }

    for (int col = 1; col <= 2 * row - 1; col++) {
        System.out.print("* ");
    }

    System.out.println();
}

Output ที่ได้คือ

    *
  * * *
* * * * *

ส่วนที่ 2 สามเหลี่ยมล่าง

ต่อมาเราต้อง print ครึ่งล่าง

  * * *
    *

ซึ่งส่วนล่างนี้เหมือนครึ่งบน แต่กลับด้านลงมา

จากเดิมครึ่งบนใช้

row = 1 -> 1 *
row = 2 -> 3 *
row = 3 -> 5 *

ครึ่งล่างจะใช้แค่

row = 2 -> 3 *
row = 1 -> 1 *

เพราะแถวกลางที่มี 5 * เรา print ไปแล้วในครึ่งบน ไม่ต้อง print ซ้ำ

ดังนั้น loop ของครึ่งล่างจะเริ่มจาก

row = n - 1

แล้วค่อย ๆ ลดลงจนถึง 1

for (int row = n - 1; row >= 1; row--)

สูตรยังเหมือนเดิม

จำนวนช่องว่าง = 2 * (n - row)
จำนวน * = 2 * row - 1

ดังนั้นโค้ดครึ่งล่างจะเป็น

for (int row = n - 1; row >= 1; row--) {
    for (int space = 1; space <= 2 * (n - row); space++) {
        System.out.print(" ");
    }

    for (int col = 1; col <= 2 * row - 1; col++) {
        System.out.print("* ");
    }

    System.out.println();
}

Output ที่ได้คือ

  * * *
    *

เอาทั้งสองส่วนมาต่อกัน

เราก็จะได้โค้ดเต็มแบบนี้

int n = 3;

// ส่วนบน
for (int row = 1; row <= n; row++) {
    for (int space = 1; space <= 2 * (n - row); space++) {
        System.out.print(" ");
    }

    for (int col = 1; col <= 2 * row - 1; col++) {
        System.out.print("* ");
    }

    System.out.println();
}

// ส่วนล่าง
for (int row = n - 1; row >= 1; row--) {
    for (int space = 1; space <= 2 * (n - row); space++) {
        System.out.print(" ");
    }

    for (int col = 1; col <= 2 * row - 1; col++) {
        System.out.print("* ");
    }

    System.out.println();
}

Output ที่ได้คือ

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

สรุปง่าย ๆ คือ pattern นี้ให้คิดเป็น 2 ช่วง

ช่วงแรก -> ดาวเพิ่มขึ้น 1, 3, 5
ช่วงสอง -> ดาวลดลง 3, 1

โดยในแต่ละแถวจะทำ 3 อย่างเหมือนเดิม

1. print ช่องว่างข้างหน้า
2. print *
3. ขึ้นบรรทัดใหม่

จุดสำคัญของรูปนี้คือจำนวนดาวไม่ได้เพิ่มทีละ 1 แล้ว แต่เพิ่มเป็นเลขคี่

1, 3, 5, 3, 1

ดังนั้นสูตรจำนวนดาวจึงเป็น

จำนวน * = 2 * row - 1

เช่นเดียวกับจำนวนช่องว่าง จากที่ลดลงทีละ 1 ก็จะเป็น

4, 2, 0, 2, 4

ดังนั้นสูตรจำนวนช่องว่างจึงเป็น

จำนวนช่องว่าง = 2 * (n - row)
Built with LogoFlowershow