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

พิมพ์ชื่อซ้ำ 10 ครั้งโดยไม่ใช้ Loop ในภาษา C (Recursion)


โจทย์

พิมพ์ชื่อ 10 ครั้ง **ห้ามใช้ Loop (for/while/do-while) และห้ามใช้ goto**

วิธีแก้: Recursion (ฟังก์ชันเรียกตัวเอง)

#include <stdio.h>

void printName(char *name, int count) {
    if (count >= 10) return; // Base Case
    
    printf("%03d: %s\n", count + 1, name);
    printName(name, count + 1); // Recursive Call
}

int main() {
    char name[50];
    printf("Enter your name: ");
    scanf("%49s", name);
    
    printName(name, 0);
    return 0;
}

ผลลัพธ์:


Enter your name: TutorialsPoint
001: TutorialsPoint
002: TutorialsPoint
003: TutorialsPoint
004: TutorialsPoint
005: TutorialsPoint
006: TutorialsPoint
007: TutorialsPoint
008: TutorialsPoint
009: TutorialsPoint
010: TutorialsPoint

อธิบายการทำงาน Recursion

printName("TutorialsPoint", 0)
  → print 001, call printName(..., 1)
    → print 002, call printName(..., 2)
      ...
        → print 010, call printName(..., 10)
          → count >= 10 → RETURN (Base Case)
        ← RETURN
      ← RETURN
    ← RETURN
  ← RETURN

เปรียบเทียบ: Loop vs Recursion

ตัวอย่าง Loop (สำหรับเปรียบเทียบ)


#include <stdio.h>
int main() {
    char name[50];
    printf("Enter name: ");
    scanf("%49s", name);
    
    for (int i = 0; i < 10; i++)
        printf("%s\n", name);
    return 0;
}

⚠️ ข้อควรระวัง Recursion

  • ต้องมี **Base Case** ชัดเจน (เงื่อนไขหยุด)
  • แต่ละ Recursive Call ใช้ Stack Memory
  • ใน C ไม่มี Tail Call Optimization (TCO) มาตรฐาน
  • เหมาะกับโจทย์ที่ Recursive โดยธรรมชาติ (Tree, Divide & Conquer)
  • **ไม่แนะนำ** สำหรับ Loop ธรรมดาใน Production Code
ด้านLoop (Iterative)Recursion
MemoryO(1) ConstantO(n) Stack Frames
Speedเร็วกว่าช้ากว่า (Function Call Overhead)
ReadabilityตรงไปตรงมาElegan สำหรับบางโจทย์
Stack Overflow Riskไม่มีมี (ถ้า Recursion ลึกมาก)