i+n - Choopan Rattanapoka

Download Report

Transcript i+n - Choopan Rattanapoka

RECURSION AND
RECURRENCE RELATIONS
Credit: Benchaporn Jantarakongkul
Burapha University
030513122 - Discrete Mathematics
Asst. Prof. Dr. Choopan Rattanapoka
Recursive Definitions
้
ั
การเรียกซา(Recursion)
เป็ นการนิยามฟั งก์ชน
ั ข ้อความ เซต หรือโครงสร ้างอืน
ฟั งก์ชน
่ ๆ บน
ั พัทธ์ใดๆในรูปของสมาชก
ิ
โดเมนหรือเอกภพสม
ทีม
่ ข
ี นาดเล็กกว่า
้ เป็ นรูปแบบทั่วไปในการนิยาม
 การเรียกซา
วัตถุใดๆ ในรูปของตัวมันเอง

Recursively Defined Functions (1)
ตัวอย่าง
 ลาดับ {an} ของยกกาลังสอง 1,2,4,8,…
นิยามโดย

an = 2n

เมือ
่ n = 0, 1, 2, …
และ สามารถนิยามแบบเรียกซา้ ได ้ดังนี:้
a0 = 1
an = 2an-1 เมือ
่ n = 0, 1, 2, …
Recursively Defined Functions (1)

ั่
เราสามารถใชวิ้ ธต
ี อ
่ ไปนี้ ในการนิยามฟั งก์ชน
ใดๆทีม
่ โี ดเมนเป็ นจานวนนับ:
้ นฐาน(Base
้
 ขันพื
ั่ เมือ
case): กาหนดค่าของฟั งก์ชน
่
pre-image เป็ นศูนย์ (หาว่าค่า f(0)=?)
้ ยกซา(Recursion):
้
ั่
 ขันเรี
สร ้างกฎสาหรับหาค่าฟั งก์ชน
ั่ ที่
เมือ
่ pre-image เป็ นจานวนเต็มใดๆ จากค่าของฟั งก์ชน
มีคา่ pre-image เป็ นจานวนเต็มทีน
่ ้อยกว่า

การนิยามดังกล่าวข ้างต ้น เรียกว่า การเรียกซา้
(recursive) หรือการนิยามเชงิ อุปนัย(inductive
definition)
ตัวอย่าง : Recursively Defined Functions


ั การเรียกซา้
ถ ้ากาหนดฟั งก์ชน
f(0) = 3
f(n) = 2f(n-1) + 3
ดังนัน
้ จะสามารถหาได ้ f(n) ต่างๆ ได ้ว่า
 f(0)
=3
 f(1) = 2 x f(0) + 3 = 2 x 3 + 3 = 9
 f(2) = 2 x f(1) + 3 = 2 x 9 + 3 = 21
 f(3) = 2 x f(2) + 3 = 2 x 21 + 3 = 45

จงหา f(4), f(5) และ f(6)
Recursive definition of Factorial

กาหนดนิยามเชงิ อุปนัย(แบบเรียกซ้า) ของ
ั่ แฟคทอเรี
ฟั งก์ชน
ยล ดังนี้
n
i
F(n) :≡ n! :≡




i 1

Base case:

Recursive part: F(n) = ?
F(0) = ?
F(1) = ?
F(2) = ?
F(3) = ?
= 12…n
F(0) :≡ ?
แบบฝึ กหัดที่ 1

จงเขียนนิยามแบบเรียกซา้ ของ i+n (i
เป็ นจานวนเต็ม, n เป็ นจานวนนับ) โดยใช ้
รูปแบบ s(i) = i+1
 ชุดลาดับของ
i+n ได ้แก่ i+0, i+1, i+2,
i+3,…
จงหา Base case คือ S(0) = ?
 จงหา Recursive part คือ S(n) = ?
 จะได ้ว่า

 S(0)
=?
 S(1) = ?
แบบฝึ กหัดที่ 2

จงเขียนนิยามแบบเรียกซา้ ของ Summation
โดยมีนย
ิ ามดังนี้
𝑛
f(n) :≡
𝑖=0 𝑖 = 0 + 1 + 2 + … + n
ปั ญหาของ Fibonacci (1)

ั เวียดเกิดทีเ่ ป็ นทีร่ ู ้จักอันหนึง่ ในกลุม
ฟั งก์ชน
่ นัก
คณิตศาสตร์ คือ ปั ญหาของ Leonardo Bonacci
ื่ Fibonacci โดย Fibonacci ได ้ตัง้
ซงึ่ รู ้จักกันในชอ
ปั ญหาไว ้ดังนี้
กระต่ายแรกเกิดเพศผู ้และเพศเมียคูห
่ นึง่ ถูก
นาไปปล่อยไว ้ทีเ่ กาะแห่งหนึง่ อยากทราบว่าจะมี
กระต่ายทัง้ หมดกีค
่ ู่ เมือ
่ เวลาผ่านไป n เดือน โดย
มีข ้อสมมุ ต วิ ่ า เมื่อ กระต่ า ยทั ง้ สองมีอ ายุ ค รบ 2
เดือ น จึงจะสามารถให ้กาเนิดกระต่า ยเพศผู ้และ
เพศเมียอีก 1 คู่ และเมือ
่ จุดเริม
่ ต ้นบนเกาะนัน
้ ไม่ม ี
ปั ญหาของ Fibonacci (2)
เดือนที่
1
2
3
4
5
6
กระต่ายบนเกาะ
กระต่ายเกิดใหม่
แบบฝึ กหัดที่ 3

จงเขียนนิยามแบบเรียกซ้าของอนุกรมไฟโบแนซซ ี
(Fibonacci series) ซงึ่ มีลาดับตัวอย่างดังนี้ :
0, 1, 1, 2, 3, 5, 8, 13, 21, ….
Recursive Euclid’s Algorithm
procedure gcd(a, b: positive integers)
while b  0
begin
r ≔ a mod b; a ≔ b; b ≔ r;
end
return a
procedure gcd(a, b: positive integers)
if b = 0 then return a
else return gcd(b,a mod b)
Iterative Fibonacci Algorithm
procedure iterative_fibo(n: nonnegative integer)
if n = 0 then y := 0
else
begin
x := 0
y := 1
for i := 1 to n-1
begin
z := x + y
x:=y
y := z
end
end {y is the n-th Fibonacci number}
Recursive Fibonacci Algorithm
procedure fibo(n: nonnegative integer)
if n  1 then return n
else return fibo(n – 1) + fibo(n – 2)



สงั เกตว่าอัลกอริธม
ึ แบบเรียกซ้าจะทาให ้เขียน
ั ้ กว่า ง่ายกว่าและง่ายต่อการทาความ
โปรแกรมได ้สน
เข ้าใจมากกว่า
้ น
แต่การเขียนโปรแกรมแบบเรียกซ้าจะใชพื
้ ทีใ่ น
หน่วยความจาทีเ่ รียกว่าสแตก(stack)มากกว่าการเขียน
โปรแกรมแบบวนลูป
สาหรับอัลกอริธม
ึ แบบเรียกซ้า(Recursive)ใดๆ จะมี
อัลกอริธม
ึ แบบวนลูป(Iterative)ทีส
่ มมูล(ให ้ผลลัพธ์ท ี่
เหมือนกัน)กันเสมอ
Recurrence Relations

ั พันธ์เวียนเกิด(recurrence relation) ของลาดับ
ความสม
ิ ก่อนหน ้า
{an} คือสมการทีแ
่ สดง an ในรูปของสมาชก
a0, …, an−1 ของลาดับนัน
้ ๆ สาหรับทุกค่า n≥n0

ั พันธ์เวียนเกิดนัน
่ เดียวกับ การ
จะเห็นว่า ความสม
้ นิยามได ้เชน
นิยามแบบเรียกซา้ แตกต่างกันทีไ่ ม่มก
ี รณีพน
ื้ ฐาน(base
cases)

เราสามารถใช ้ ลาดับใดๆทีไ่ ม่อยูใ่ นรูปของการเรียกซ้า
ั พันธ์เวียนเกิดทีก
เป็ นผลเฉลยของความสม
่ าหนดได ้
หากลาดับดังกล่าวสอดคล ้องกับนิยามของการเวียน
เกิด

ั พันธ์เวียนเกิดหนึง่ ๆ อาจมีผลเฉลยได ้มากกว่าหนึง่
ความสม
ผลเฉลย
ตัวอย่าง: Recurrence Relation
ั พันธ์เวียนเกิด
พิจารณาความสม
an = 2an−1 − an−2 (n≥2)
 ลาดับต่อไปนีเ
้ ป็ นผลเฉลยของ
ั พันธ์ข ้างต ้นหรือไม่?
ความสม
an = 3n
an = 2n
an = 5

้
การใชประโยชน์
จาก Recurrence
Relation (1)


ี อมทรัพย์
นายภักดี ฝากเงิน 10,000 บาทไว ้ในบัญชอ
ทีใ่ ห ้ดอกเบีย
้ 5% ต่อปี สะสมไว ้เป็ นเงินฝากต่อไปทุกปี
เมือ
่ เวลาผ่านไป 30 ปี เงินในบัญชเี งินฝากของนาย
ภักดีจะเป็ นเท่าไร?
วิธท
ี า
ี ลังจากเวลาผ่านไป n ปี
ให ้ Pn แทนจานวนเงินในบัญชห
 จงเขียน Pn ในรูปของ Pn-1?
 Pn = Pn-1 + (0.05 x Pn-1) = 1.05 x Pn-1

P1 = (1.05)P0
 P2 = (1.05)P1 = (1.05)2 P0
 P3 = (1.05)P2 = (1.05)3 P0

n
จะเห็นว่า ได ้สูตรสาหรับ
คานวณค่า Pn สาหรับจานวน
นับ n ใดๆได ้ โดยไม่
จาเป็ นต ้องทาการคานวณเรียก
้
การใชประโยชน์
จาก Recurrence
Relation (2)

ั พันธ์เวียนเกิด
เมือ
่ ได ้ความสม
Pn = (1.05)n P0
จึงสามารถใชสู้ ตรทีห
่ าได ้คานวณหา P30 ภายใต ้
เงือ
่ นไขเริม
่ ต ้น
P0 = 10,000
P30 = (1.05)3010,000 = 43,219.42


ี ะมีเงิน
ดังนัน
้ เมือ
่ ผ่านไป 30 ปี เงินฝากในบัญชจ
ทัง้ หมด 43,219.42 บาท
ตัวอย่าง: Tower of Hanoi (1)

นิยายปรัมปราเกีย
่ วกับหอคอยแห่งฮานอยเล่าว่า ถ ้า
ท่านสามารถย ้ายแผ่นทองคาจานวน 64 แผ่นทีเ่ รียง
อยูท
่ เี่ สาต ้นหนึง่ โดยมีแผ่นทองคาขนาดใหญ่อยู่
ด ้านล่าง และมีแผ่นทองคาทีเ่ ล็กกว่าอยูด
่ ้านบน ไป
เรียงไปยังเสาอีกต ้นหนึง่ ได ้ในลักษณะเดียวกัน โดย
ให ้เคลือ
่ นย ้ายได ้ทีแ
่ ผ่นและห ้ามแผ่นทองคาทีใ่ หญ่
กว่าอยูบ
่ นแผ่นทองคาทีเ่ ล็กกว่า การเคลือ
่ นย ้ายแผ่น
้
ทองคา 1 แผ่นจะใชเวลาประมาณ
1 วินาที ถ ้าทา
สาเร็จจะสามารถครองโลกได ้ ถามว่าท่านจะต ้องใช ้
เวลาอย่างน ้อยเท่าไร จึงจะสามารถครองโลกได ้
ตัวอย่าง: Tower of Hanoi (2)

ปั ญหา: ย ้ายแผ่นดิสก์จากหลักที่ 1 ไปยังหลักที่ 2
 กฎ:
(a) แต่ละครัง้ ย ้ายได ้เพียงแผ่นเดียว
 (b) แผ่นดิสก์ทใ
ี่ หญ่กว่าจะอยูบ
่ นแผ่นทีเ่ ล็กกว่าไม่ได ้
หลัก #1
หลัก #2
หลัก #3
Hanoi Recursion Function

ให ้ Hn = จานวนครัง้ ของการย ้ายแผ่นดิสก์ n แผ่น
วิธก
ี ารย้ายแผ่นทองคา:
 ย ้ายแผ่นทองคา n−1 แผ่นทีอ
่ ยูด
่ ้านบนไปยังหลักอืน
่ ๆ
้ั
(มีการย้ายแผ่น Hn−1 ครง)
้ั
 ย ้ายแผ่นทองคาทีอ
่ ยูด
่ ้านล่าง (ย้าย 1 ครง)
 ย ้ายแผ่นทองคา n−1 แผ่นทีอ
่ ยูด
่ ้านบน(ทีย
่ ้ายไปไว ้
ยังหลักอืน
่ )ไปไว ้บนแผ่นทีอ
่ ยูด
่ ้านล่าง (มีการย้าย
้ั
แผ่น Hn−1 ครง)
ฟั งก ์ช ันเวียนเกิดคือ:
Hn = 2Hn−1 + 1
Hanoi Recurrence Relation

สังเกตว่า:
Hn = 2Hn−1 + 1
 จานวนครัง
้ ของการย ้ายแผ่นทองคาสามารถอธิบายได ้
ั พันธ์เวียนเกิด
ด ้วยความสม
Hn
= 2 Hn−1 + 1
= 2 (2 Hn−2 + 1) + 1
= 22 Hn−2 + 2 + 1
= 22(2 Hn−3 + 1) + 2 + 1 = 23 Hn−3 + 22 + 2 + 1
…
= 2n−1 H1 + 2n−2 + … + 2 + 1
H1 = 1𝑛
𝑖
= 2n−1 + 2n−2 + … + 2 + 1
=

𝑛 −1 𝑖
𝑖=0 2
𝑎𝑟 = 𝑎
𝑟 𝑛+1 −1
𝑟 −1
𝑖=0
ั พันธ์เวียนเกิดของ Tower of
เพราะฉะนั น
้ ความสม
คาตอบของ Tower of Hanoi



มีแผ่นทองคาทีต
่ ้องย ้ายจานวน 64 แผ่น
Recurrence Relation คือ Hn = 2n – 1
แทนค่าจะได ้ว่า
 จานวนครัง
้ ทีต
่ ้องย ้ายแผ่นทองคาคือ
H64 = 264 – 1
 H64 = 264 – 1 = 18,446,774,073,709,551,615



การย ้าย 1 ครัง้ ในเวลา 1 วินาที
1 ปี มป
ี ระมาณ 60 x 60 x 24 x 356 = 30,758,400
วินาที
้
ดังนัน
้ ต ้องใชเวลาในการย
้ายประมาณ
599,731,262,800 ปี
แบบฝึ กหัดทาสง่


จงเขียน pseudo-code ของในการหา Factorial ใน
ั เวียนเกิด
รูปแบบของฟั งก์ชน
จงเขียน pseudo-code ของในการหา Summation ใน
ั เวียนเกิด
รูปแบบของฟั งก์ชน