การพิมพ์เลขโดยไม่ใช้ Loop
ใช้ Recursion แทนการวนลูป: ฟังก์ชันเรียกตัวเองจนถึง base case
ตัวอย่างโค้ด
public class Demo {
public static void main(String[] args) {
int start = 0;
System.out.println("พิมพ์เลข 0-15 โดยไม่ใช้ loop:");
printWithoutLoop(start);
System.out.println(); // newline
}
public static void printWithoutLoop(int num) {
if (num <= 15) {
System.out.print(num + ", ");
printWithoutLoop(num + 1); // Recursive call
}
// Base case: num > 15 -> return (implicit)
}
}
ผลลัพธ์
พิมพ์เลข 0-15 โดยไม่ใช้ loop: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
คำอธิบาย
mainเรียกprintWithoutLoop(0)- ฟังก์ชันตรวจสอบ
if (num <= 15) - พิมพ์ค่า
numแล้วเรียกตัวเองด้วยnum + 1 - เมื่อ
num = 16เงื่อนไขเป็น false → return (base case) - Call stack unwind กลับมาทีละระดับจนจบ
Call Stack Visualization
printWithoutLoop(0)
printWithoutLoop(1)
printWithoutLoop(2)
...
printWithoutLoop(15)
printWithoutLoop(16) -> base case, return
return
...
return
return
return
ข้อดี/ข้อเสีย
| ข้อดี | ข้อเสีย |
|---|---|
| โค้ดสั้น สะท้อน logic ชัดเจน | ใช้ Stack Space O(n) อาจ StackOverflow |
| เหมาะสำหรับปัญหา recursive nature | ช้ากว่า loop (function call overhead) |
| อ่านเข้าใจง่าย (บางกรณี) | Debug ยากกว่า loop |
การปรับปรุง: Tail Recursion (ไม่ได้ optimize ใน Java)
// Java ไม่มี Tail Call Optimization (TCO)
// แต่นี่คือรูปแบบ tail recursion:
static void printTailRec(int current, int end) {
if (current > end) return;
System.out.print(current + ", ");
printTailRec(current + 1, end); // tail call
}
เมื่อไหร่ควรใช้ Recursion แทน Loop
- Tree/Graph traversal (DFS)
- Divide & Conquer (Merge Sort, Quick Sort)
- Backtracking (N-Queens, Maze)
- Dynamic Programming (Memoization)
- ไม่เหมาะ สำหรับ iteration แบบง่าย เช่น พิมพ์เลข 1..n