Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

พิมพ์เลข 0-15 ใน Java โดยไม่ใช้ Loop (Recursion)

การพิมพ์เลขโดยไม่ใช้ 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, 

คำอธิบาย

  1. main เรียก printWithoutLoop(0)
  2. ฟังก์ชันตรวจสอบ if (num <= 15)
  3. พิมพ์ค่า num แล้วเรียกตัวเองด้วย num + 1
  4. เมื่อ num = 16 เงื่อนไขเป็น false → return (base case)
  5. 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