C Academy · บทเรียน

ปัญหาการเรียกซ้ำคลาสสิก

แฟกทอเรียลและฟีโบนัชชี

บทเรียน 2 จาก 413 ขั้นตอน

ปัญหาการเรียกซ้ำคลาสสิก เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาคลาสสิก

ปัญหาบางประเภทเหมาะกับการใช้การเรียกซ้ำโดยธรรมชาติ การเรียนรู้ตัวอย่างคลาสสิกจะทำให้คุณมีรูปแบบที่นำกลับมาใช้ได้

ในบทเรียนนี้ เราจะครอบคลุมแฟกทอเรียล ฟีโบนักชี ผลรวมของเลขโดด ห.ร.ม. และการย้อนลำดับเอาต์พุต

แฟกทอเรียล

แฟกทอเรียลของ n คือ n คูณด้วยแฟกทอเรียลของ n ลบ 1 โดย 1! มีค่าเท่ากับ 1

นี่คือการเรียกซ้ำตามตำรา: มีกรณีฐานที่ชัดเจนและการเรียกซ้ำหนึ่งครั้ง

#include <stdio.h>

long factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main(void) {
    printf("%ld\n", factorial(6));
    return 0;
}

จำนวนฟีโบนักชี

จำนวนฟีโบนักชีแต่ละจำนวนเป็นผลรวมของสองจำนวนก่อนหน้า นิยามแบบเรียกซ้ำต้องมีกรณีฐานสองกรณี: fib(0)=0 และ fib(1)=1

รูปแบบนี้เรียกใช้ฟังก์ชันสองครั้งในแต่ละขั้น

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

การทำงานของฟีโบนักชี

นี่คือโปรแกรมฉบับสมบูรณ์ โดย fib(10) ควรพิมพ์ค่า 55

โปรดทราบว่าเวอร์ชันพื้นฐานนี้ทำงานซ้ำ จึงช้าเมื่อ n มีค่ามาก

#include <stdio.h>

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

int main(void) {
    printf("%d\n", fib(10));
    return 0;
}

ผลรวมของเลขโดด

หากต้องการบวกเลขโดดของจำนวนหนึ่ง ให้ดึงเลขโดดหลักสุดท้ายด้วย n % 10 แล้วเรียกซ้ำกับส่วนที่เหลือด้วย n / 10

กรณีฐานคือเมื่อ n มีค่าเป็น 0

int digit_sum(int n) {
    if (n == 0) return 0;
    return (n % 10) + digit_sum(n / 10);
}

ผลรวมเลขโดดในการทำงาน

สำหรับ 1234 ผลรวมคือ 1+2+3+4 = 10 มายืนยันผลด้วยโปรแกรมฉบับสมบูรณ์กัน

#include <stdio.h>

int digit_sum(int n) {
    if (n == 0) return 0;
    return (n % 10) + digit_sum(n / 10);
}

int main(void) {
    printf("%d\n", digit_sum(1234));
    return 0;
}

ตัวหารร่วมมาก

ขั้นตอนวิธีของยุคลิดเหมาะกับการเขียนแบบเรียกซ้ำโดยธรรมชาติ GCD ของ a และ b เท่ากับ GCD ของ b และ a % b

เมื่อ b กลายเป็น 0 คำตอบก็คือ a

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

โปรแกรม GCD ฉบับสมบูรณ์

GCD ของ 48 และ 18 คือ 6 โปรแกรมนี้จะพิมพ์ค่าดังกล่าว

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

int main(void) {
    printf("%d\n", gcd(48, 18));
    return 0;
}

การย้อนลำดับจำนวน

การเรียกซ้ำยังสามารถควบคุมเอาต์พุตได้ด้วย การพิมพ์เลขโดดหลักสุดท้ายหลังจากเรียกซ้ำจะทำให้ลำดับการประมวลผลย้อนกลับโดยธรรมชาติ

ตัวช่วยนี้พิมพ์เลขโดดแต่ละตัวของจำนวนหนึ่งแยกกัน โดยใช้การเรียกซ้ำ

#include <stdio.h>

void print_digits(int n) {
    if (n == 0) return;
    print_digits(n / 10);
    printf("%d ", n % 10);
}

int main(void) {
    print_digits(729);
    printf("\n");
    return 0;
}

ฟังก์ชันยกกำลัง

การยกฐานขึ้นเป็นเลขชี้กำลังก็ใช้การเรียกซ้ำเช่นกัน: base^exp เท่ากับ base คูณด้วย base^(exp-1)

กรณีฐานคือเลขชี้กำลัง 0 ซึ่งคืนค่าเป็น 1

long power(int base, int exp) {
    if (exp == 0) return 1;
    return base * power(base, exp - 1);
}

รูปแบบที่นำกลับมาใช้ซ้ำ

สังเกตรูปแบบร่วมกันนี้: ตรวจสอบกรณีฐาน จากนั้นรวมขั้นตอนปัจจุบันเข้ากับผลลัพธ์จากการเรียกที่เล็กลง

เมื่อมองเห็นรูปแบบนี้แล้ว ปัญหาจำนวนมากก็กลายเป็นฟังก์ชันเรียกซ้ำสั้น ๆ

ตรวจสอบอย่างรวดเร็ว

เลือกกรณีฐานที่ถูกต้อง

สรุปทบทวน

แฟกทอเรียล, Fibonacci, ผลรวมหลักตัวเลข, GCD และการยกกำลัง ล้วนใช้รูปแบบการเรียกซ้ำเดียวกัน: จัดการกรณีฐาน จากนั้นรวมค่าปัจจุบันเข้ากับปัญหาย่อยที่เล็กลง

แม่แบบเหล่านี้นำไปใช้กับงานอื่น ๆ ได้อีกมากมาย

เริ่มต้นได้ฟรี

เรียนรู้ C ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “ปัญหาการเรียกซ้ำคลาสสิก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ปัญหาการเรียกซ้ำคลาสสิก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ปัญหาการเรียกซ้ำคลาสสิก”

แฟกทอเรียลและฟีโบนัชชี คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ปัญหาการเรียกซ้ำคลาสสิก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียกซ้ำทำงานอย่างไร
  2. ปัญหาการเรียกซ้ำคลาสสิก
  3. การเรียกซ้ำเทียบกับการวนซ้ำ
  4. หลีกเลี่ยงสแตกโอเวอร์โฟลว์
← กลับไปที่ C Academy