บทที่ 13

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

similar documents