Recursive Method
บทนำ การทำงานภายใน method หนึ่งสามารถเรียกใช้ method อื่นได้ method a เรียกใช้ method b method b เรียกใช้ method a method a เรียกใช้ตัวเอง
Method แบบเรียกตัวเองซ้ำ (recursive method)
Method แบบเรียกซ้ำ คือการที่ method เรียกใช้งาน method ของตัวเองซ้ำๆภายใน method นั้น คล้ายกับการทำงานแบบ loop แต่จะไม่คำสั่ง while หรือ for ปรากฎอยู่เลย
Recursive Programming การเขียนโปรแกรมให้ method ใด method หนึ่ง หรือ หลาย method เรียกใช้ method ตัวเองซ้ำภายใน method นั้นไปเรื่อยๆ จนกว่าจะหลุดพ้นจากเงื่อนไขที่ตั้งไว้
Method แบบเรียกซ้ำ ทำไมต้องเขียน method แบบเรียกตัวเองซ้ำๆ บางกรณีการเขียนโปรแกรมลักษณะนี้ทำให้ได้โปรแกรมที่สั้น สามารถเขียนคำสั่งได้ตรงไปตรงมาตามคำนิยามทางคณิตศาสตร์ ได้โปรแกรมที่สวย (ขึ้นกับรสนิยม) อ่านเข้าใจง่าย
ตัวอย่าง recursive method กําหนดให้เมท็อด f(…) ใช้หาผลบวกของตวัเลขจํานวนเต็มตั้งแต่ 0 จนถึง n โดยที่ f(n) = (0+1+2+ … +n)
ขั้นตอนการทำงานของ recursive method ประกอบด้วย 2 กรณี Recursion case เป็นกรณีที่ method คืนค่าที่เกิดจากการเรียกใช้ method ของตัวมันเอง เช่น return fac(n-1), return fibo(n-1) + fibo(n-2) เป็นต้น เสมือนเป็นการเรียกซ้ำ เมท็อดตัวเองอีกครั้งอยู่ภายใน method นั้น โดยจะเรียกซ้ำแบบนี้ไปเรื่อยๆ จนกว่าจะเข้าสู่ Base case จึงจะหยุดการเรียกซ้ำ Base case เป็นกรณีสิ้นสุดการเรียกตัวเองซ้ำ ซึ่ง method จะคืนค่าคงที่ค่าใดค่าหนึ่งออกมา เช่น return 0 , return 1 เป็นต้น
จงแสดงผลลัพธ์จากการเรียกใช้ recursive method คำตอบ mul(4,3) 3 + mul(3, 3) 3 + (3 + mul(2,3)) 3 + 3 + (3 + mul(1,3)) 3 + 3 + 3 + (3 + mul(0,3)) 3 + 3 + 3 + 3 + 0 = 12 mul(5,7) 7 + 7 + 7 + 7 + 7 + 0 = 35 mul(20,10) 10 + 10 + 10 … + 10 + 0 = 200
จงแสดงผลลัพธ์จากการเรียกใช้ recursive method คำตอบ gcd(28,16) gcd(16 , 12) gcd(12, 4) 4 gcd(9,14) gcd(14, 9) gcd(9,5) gcd(5,4) gcd(4,1) 1 การเรียกใช้ คำตอบ gcd(75,30) gcd(30,15) 15
จงแสดงผลลัพธ์จากการเรียกใช้ recursive method expo(3) 8 4 4 2 2 2 2 1 1 1 1 1 1 1 1
Recursive อย่างง่าย ขั้นตอนการแปลงสมการคณิตศาสตร์ให้เป็น recursive method แบบง่าย EX. จงหาผลบวกของตัวเลขจํานวนเต็มตั้งแต่ 0 จนถึง n (โดยที่ n ≥ 0) แปลงโจทย์ที่กําหนดให้ เป็นสมการหรือฟังก์ชันทางคณิตศาสตร์ หรือสมการในรูปทั่วไป แยกสมการออกเป็น 2 กรณี (หรืออาจจะมากกว่า 2 กรณีก็ได้) กรณีที่สมการเท่ากับค่าของพจน์แรกเพียงพจน์เดียวซึ่งจะได้ (2) กรณีที่สมการอยู่ในรูปทั่วไป แต่จะดึงพจน์สุดท้ายออกมาให้เห็นในสมการซึ่งจะได้
Recursive อย่างง่าย ขั้นตอนการแปลงสมการคณิตศาสตร์ให้เป็น recursive method แบบง่าย EX. จงหาผลบวกของตัวเลขจํานวนเต็มตั้งแต่ 0 จนถึง n (โดยที่ n ≥ 0) แปลงสมการทั้ง 2 กรณีที่ได้จากขั้นตอนที่ 2 ให้เป็น method โดยใช้คําสั่ง if-else เพื่อระบุ เงื่อนไขของแต่ละกรณี ซึ่งจะให้กรณีที่ 1 เป็น Base case และกรณีที่ 2 เป็น recursion case
ตัวอย่าง จงพิจารณาสมการต่อไปนี้เพื่อเขียนเป็น method f(…) ที่ทำงานแบบ recursive โดยให้รับค่า n เข้ามาทางพารามิเตอร์ n=1 , f(1) = 1 f(n) = f(n-1) + (1/n3)
ตัวอย่าง จงพิจารณาสมการต่อไปนี้เพื่อเขียนเป็น method f(…) ที่ทำงานแบบ recursive โดยให้รับค่า n เข้ามาทางพารามิเตอร์ f(1) = 11 + 2(1) = 3 f(n) = f(n-1) + (nn + 2n)
ตัวอย่างการเขียน method แบบเรียกซ้ำ ผลบวก 1 + 2 + … + n เราสามารถเขียน method หาผลบวก int sum(int n) เพื่อคืนผลบวก 1 + 2 + … + n ได้ไม่ยาก สมมุติว่าไม่ใช้สูตร เราคงเขียน method โดยการใช้ loop
ตัวอย่างการเขียน method แบบเรียกซ้ำ ผลบวก 1 + 2 + … + n จากนิยาม Sn = Sn-1 + n เมื่อ n > 0 และ S0 = 0 เราสามารถเขียน method แบบเรียกซ้ำ สั้นๆ ได้ ดังนี้ public static int sum(int n) { if(n==0) { return 0; } else{ sum = sum(n-1) + n; } return sum;
จำนวนฟิโบนักชี จำนวนฟิโบนักชี (Fibonacci number) คือ จำนวนในลำดับ 0, 1, 1, 2, 3, 5, 8, 13, … ให้ fn คือ จำนวนฟิโบนักชีตัวที่ n จะได้ว่า fn = fn-1 + fn-2 เมื่อ n >= 2 และ f0 = 1, f1 = 1
จำนวนฟิโบนักชี นิยาม fn = fn-1 + fn-2 เมื่อ n >= 2 และ f0 = 1, f1 = 1 ลักษณะปัญหาเช่นนี้ เหมาะที่จะแปลงเป็น method แบบเรียกซ้ำ ลองเขียนโปรแกรมกัน ^^
จำนวนฟิโบนักชี public static int fib(int n){ if(n <= 1) { return n; // f0 = 1, f1 = 1 } else { return fib(n-1) + fib(n-2) ; // fn = fn-1 + fn-2 }