*  
  * *  
 * * *  
* * * *

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

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

ดังนั้น pattern นี้ไม่ได้คิดแค่จำนวน * อย่างเดียวแล้ว แต่ต้องคิดเป็น 2 ส่วนในแต่ละแถว

1. print ช่องว่างข้างหน้า
2. print *

เราจะเห็นได้ว่า

จำนวนช่องว่าง = จำนวนแถวทั้งหมด - เลขแถว
จำนวน * = เลขแถว

เพราะฉะนั้น ในแต่ละแถว เราจะใช้ loop 2 ตัวข้างใน

ดังนั้นเราก็จะยังใช้ Nested Loop เหมือนเดิม โดยให้

  • Loop นอก ควบคุมจำนวนแถว

แต่ว่า Loop ในเราจะมี 2 อัน นั่นก็คือ

  • Loop ในตัวแรก ควบคุมจำนวนช่องว่างที่ต้อง print ในแถวนั้น
  • Loop ในตัวที่สอง ควบคุมจำนวน * ที่ต้อง print ในแถวนั้น

ยกตัวอย่างเช่น ในแถวที่ 2 เราต้องการ print ช่องว่าง 2 ช่อง แล้ว print * 2 อัน

เราก็จะสามารถเขียนออกมาเป็นโค้ดได้เป็น

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

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

Output ที่ได้คือ

  * *

กลับมาที่คำถาม แล้วเราจะทำให้ในแต่ละแถว print ช่องว่างกับ * ตามที่เราคิดกันไว้

จำนวนช่องว่าง = จำนวนแถวทั้งหมด - เลขแถว
จำนวน * = เลขแถว

ยังไงล่ะ? คำตอบคือ เราก็ใส่สิ่งที่เราคิดหรือก็คือเงื่อนไข ไว้ในช่องที่กำหนดจำนวนรอบของ Loop ในที่ควบคุมการ print ช่องว่างและ * แต่ละอันสิ

โดยเราจะกำหนดให้มีตัวแปร n แทนจำนวนแถวทั้งหมด

int n = 4;

จำนวนช่องว่างข้างหน้า คือ

n - row

จำนวน * คือ

row

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

int n = 4;

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

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

    System.out.println();
}

Output ที่ได้คือ

   *
  * *
 * * *
* * * *

ซึ่ง Loop นอกของเรา จะทำหน้าที่ควบคุมจำนวน row

for (int row = 1; row <= n; row++)

Loop นี้หมายความว่า ให้ทำงานทั้งหมด n แถว ในที่นี้ก็คือ 4 แถว

จากนั้น Loop ในตัวแรก จะทำหน้าที่ควบคุมจำนวนช่องว่างข้างหน้า

for (int space = 1; space <= n - row; space++)

Loop นี้หมายความว่า ในแต่ละแถว ให้ print ช่องว่างข้างหน้าก่อน โดยจำนวนที่ print ออกมาก็คือ n - row

หลังจาก print ช่องว่างเสร็จแล้ว Loop ในตัวที่สอง จะทำหน้าที่ print *

for (int col = 1; col <= row; col++)

Loop นี้หมายความว่า ให้ print * ตามเลขแถวนั้น

หลังจาก Loop ช่องว่างและ Loop * ทำงานครบแล้ว หรือก็คือ print ครบ 1 แถวแล้ว เราก็จะขึ้นบรรทัดใหม่ด้วย

System.out.println();
Built with LogoFlowershow