## การใช้งาน Recursive Function ในภาษา Objective-C แบบง่าย ๆ
Recursive function หรือ ฟังก์ชันเรียกซ้ำเป็นหนึ่งในแนวคิดที่สำคัญในภาษาการเขียนโปรแกรม ที่ให้โปรแกรมเมอร์ได้เข้าใจถึงการทำซ้ำการประมวลผลลึก ๆ ไปในระดับที่ขึ้นอยู่กับข้อมูล ซึ่งสามารถทำให้โค้ดที่ซับซ้อนกลายเป็นสั้น และอ่านง่ายขึ้น
ภาษา Objective-C ซึ่งเป็นภาษาที่ใช้พัฒนาแอปพลิเคชันสำหรับระบบ iOS ก็เปิดโอกาสให้นักพัฒนาสามารถใช้ recursive functions เพื่อจัดการกับงานที่ต้องการการคำนวณแบบเรียกซ้ำได้เช่นกัน
ในบทความนี้ เราจะมาเจาะลึกถึงการใช้งาน recursive function ใน Objective-C พร้อมตัวอย่างโค้ด 3 ตัวอย่าง และอธิบายการทำงาน รวมถึงยกตัวอย่าง usecase ในโลกจริงที่สามารถปรับใช้ recursive function ได้
เมื่อคุณต้องการหาปัจจัยของตัวเลขหนึ่ง ๆ การใช้ recursive function สามารถทำได้ดังนี้:
#import
// Recursive function สำหรับหาปัจจัย
int findFactorial(int number) {
if(number == 1) { // ทางออกของ recursion
return 1;
} else {
return number * findFactorial(number - 1); // เรียก function ตัวเอง
}
}
int main() {
@autoreleasepool {
int result = findFactorial(5);
NSLog(@"Factorial of 5 is: %d", result);
}
return 0;
}
การทำงานของโค้ด: โค้ดนี้เริ่มต้นด้วยการเรียกรูปแบบเรียกซ้ำของฟังก์ชัน `findFactorial()` จนกระทั่งเลขที่ส่งเข้าไปเท่ากับ 1 จึงจะหยุดเรียกรูปแบบเรียกซ้ำ ได้ผลลัพธ์คือการคำนวณแฟคทอเรียลของตัวเลขนั้นๆ
การค้นหาข้อมูลด้วยการเรียกซ้ำมักใช้ในโครงสร้างข้อมูล tree ที่มีข้อมูลจัดเก็บในรูปของ nodes และ branches:
#import
@interface TreeNode : NSObject {
NSInteger value;
TreeNode *leftChild;
TreeNode *rightChild;
}
- (instancetype)initWithValue:(NSInteger)val;
- (BOOL)search:(NSInteger)val;
@end
@implementation TreeNode
- (instancetype)initWithValue:(NSInteger)val {
if((self = [super init])) {
value = val;
leftChild = nil;
rightChild = nil;
}
return self;
}
- (BOOL)search:(NSInteger)val {
if(val == value) { // เจอข้อมูล
return YES;
} else if(val < value) { // ค้นหาทางซ้าย
return leftChild ? [leftChild search:val] : NO;
} else { // ค้นหาทางขวา
return rightChild ? [rightChild search:val] : NO;
}
}
@end
int main() {
@autoreleasepool {
TreeNode *root = [[TreeNode alloc] initWithValue:5];
// สร้าง tree ด้วย TreeNode ต่างๆ...
BOOL found = [root search:7];
NSLog(@"Value %@ found in tree.", found ? @"is" : @"is NOT");
}
return 0;
}
ในโค้ดนี้ `TreeNode` class มีการใช้ recursive search method สำหรับการค้นหาข้อมูลใน tree structure โดยจะค้นหาที่ left child หรือ right child อย่างเป็นลำดับขึ้นอยู่กับค่าที่กำหนด
การวนระดับความลึกของไดเรกทอรี หรือ directory tree traversal ก็เป็นการใช้งาน recursive function:
#import
// พิมพ์รายการของไฟล์และไดเรกทอรีภายใน path ที่กำหนด
void listFiles(NSString *path, int depth) {
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
for (NSString *file in contents) {
for(int i = 0; i < depth; i++) { // Indent ตามความลึก
printf("--");
}
NSLog(@"%@", file);
NSString *fullPath = [path stringByAppendingPathComponent:file];
BOOL isDirectory;
[[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory];
if (isDirectory) {
listFiles(fullPath, depth + 1); // list ในโฟลเดอร์ย่อย
}
}
}
int main() {
@autoreleasepool {
NSString *path = @"/path/to/directory";
listFiles(path, 0);
}
return 0;
}
โค้ดนี้ใช้ `listFiles` function เพื่อไล่ระดับของไดเรกทอรีและพิมพ์รายการไฟล์บนคอนโซลตามความลึกของการจัดเก็บ
Recursive functions ได้ถูกใช้งานในการพัฒนาแอปพลิเคชันต่าง ๆ เช่น การพัฒนาเกม (เช่น การคำนวณการเดินทางของชิ้นหมากรุก), การวิเคราะห์ข้อมูล (เช่น การค้นหาแบบ depth-first ใน tree structures), หรือแม้แต่ในการย้อนกลับเส้นทางในแอปพลิเคชันด้านนำทาง (GPS).
โดยทั่วไป recursive functions ณ ระดับหนึ่งสามารถทำให้โค้ดมีความกระชับและสามารถอ่านเข้าใจได้ง่าย เมื่อเทียบกับการใช้ลูปแบบต่างๆ อย่างไรก็ตาม การใช้งานเกินข้อจำกัดจะทำให้เกิดการล่มสลายของ stack (stack overflow) ดังนั้น การใช้งานจะต้องพิจารณาถึงขอบเขตและเงื่อนไขทางออก (base case) อย่างรอบคอบ
หากคุณสนใจเรียนรู้การเขียนโปรแกรมด้วย Objective-C และต้องการเข้าใจถึงการใช้งานหลักการ recursive function และหลักการโปรแกรมมิ่งที่ลึกซึ้งยิ่งขึ้น ณ EPT – Expert-Programming-Tutor เรามีหลักสูตรที่จะทำให้คุณได้เรียนรู้และฝึกฝนไปกับเทคนิคและทักษะในการเขียนโปรแกรมอย่างมืออาชีพ ทั้งนี้เรายินดีที่จะเป็นส่วนหนึ่งของเส้นทางการเรียนรู้ของคุณ
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: recursive_function objective-c programming_concept code_example factorial_calculation tree_structure data_search directory_traversal real-world_usecase programming ios_development
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM