ปัญหาการเรียกซ้ำคลาสสิก
แฟกทอเรียลและฟีโบนัชชี
ปัญหาการเรียกซ้ำคลาสสิก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียกซ้ำทำงานอย่างไร
- ปัญหาการเรียกซ้ำคลาสสิก
- การเรียกซ้ำเทียบกับการวนซ้ำ
- หลีกเลี่ยงสแตกโอเวอร์โฟลว์