4
*
* * *
* * * * *
* * *
*
ให้น้อง ๆ ลองสังเกต 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)