360 likes | 959 Views
Recursion and Recurrence Relations. Recursive Definitions. การเรียกซ้ำ( Recursion ) เป็นหลักการที่เกี่ยวข้องอย่างใกล้ชิดกับการอุปนัยเชิงคณิตศาสตร์( mathematical induction )
E N D
Recursion and Recurrence Relations Faculty of Informatics, Burapha University
Recursive Definitions การเรียกซ้ำ(Recursion)เป็นหลักการที่เกี่ยวข้องอย่างใกล้ชิดกับการอุปนัยเชิงคณิตศาสตร์(mathematical induction) ในการอุปนัย เราพิสูจน์ว่าฟังก์ชันข้อความ(predicate) Pเป็นจริง สำหรับสมาชิกทุกตัวของเซตอนันต์ใดๆโดยพิสูจน์ค่าความจริงของpredicateสำหรับสมาชิกจำนวนมาก ในรูปของสมาชิกที่มีขนาดเล็กกว่า ในการนิยามแบบเรียกซ้ำ(recursive definitions) เรานิยามฟังก์ชั่น ฟังก์ชั่นข้อความ เซต หรือโครงสร้างอื่นๆบนโดเมนหรือเอกภพสัมพัทธ์ใดๆในรูปของสมาชิกที่มีขนาดเล็กกว่า การเรียกซ้ำเป็นรูปแบบทั่วไปในการนิยามวัตถุใดๆ ในรูปของตัวมันเอง Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 2 2
Recursively Defined Functions ตัวอย่าง เช่น: ลำดับ {an} ของยกกำลังสอง 1,2,4,8,… นิยามโดย an = 2nเมื่อn = 0, 1, 2, … และ สามารถนิยามแบบเรียกซ้ำได้ดังนี้: a0 = 1 an = 2an-1เมื่อn = 0, 1, 2, … จากตัวอย่าง จะเห็นได้ชัดว่า อุปนัย และการเรียกซ้ำนั้นมีหลักการคล้ายคลึงกัน Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 3 3
Recursively Defined Functions เราสามารถใช้วิธีต่อไปนี้ ในการนิยามฟังก์ชั่นใดๆที่มีโดเมนเป็นจำนวนนับ: ขั้นพื้นฐาน(Base case):กำหนดค่าของฟังก์ชั่นเมื่อ pre-image เป็นศูนย์(หาว่าค่าf(0)=?) ขั้นเรียกซ้ำ(Recursion):สร้างกฎสำหรับหาค่าฟังก์ชั่นเมื่อ pre-image เป็นจำนวนเต็มใดๆ จากค่าของฟังก์ชั่นที่มีค่า pre-image เป็นจำนวนเต็มที่น้อยกว่า การนิยามดังกล่าวข้างต้น เรียกว่า การเรียกซ้ำ(recursive) หรือการนิยามเชิงอุปนัย(inductive definition) Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 4 4
Recursively Defined Functions ตัวอย่าง เช่น: f(0) = 3 f(n) = 2f(n-1) + 3 f(0) = 3 f(1) = 2 f(0) + 3 = 23 + 3 = 9 f(2) = 2 f(1) + 3 = 29 + 3 = 21 f(3) = 2 f(2) + 3 = 221 + 3 = 45 f(4) = 2 f(3) + 3 = 245 + 3 = 93 จงหาf(5), f(6), f(7), f(8) Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 5 5
Recursive definition of Factorial กำหนดนิยามเชิงอุปนัย(แบบเรียกซ้ำ) ของฟังก์ชั่นแฟคทอเรียล ดังนี้,F(n) :≡n! :≡ = 12…n Base case: F(0) :≡ 1 Recursive part: F(n) = (n) F(n-1) F(0) = 1 F(1) = 1 F(0) = 11 = 1 F(2) = 2 F(1) = 21 = 2 F(3) = 3 F(2) = 32 = 6 F(4) = 4 F(3) = 46 = 24 Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 6 6
Examples จงเขียนนิยามแบบเรียกซ้ำของ: i+n (iเป็นจำนวนเต็ม, nเป็นจำนวนนับ) โดยใช้รูปแบบ s(i) = i+1 a·n (aเป็นจำนวนจริง, nเป็นจำนวนนับ) โดยใช้การบวก an(aเป็นจำนวนจริง, nเป็นจำนวนนับ) โดยใช้การคูณ (สำหรับอนุกรมของจำนวน {ai}) (สำหรับอนุกรมของจำนวน {ai}) (สำหรับอนุกรมของเซต{Si}) Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 7 7
i+n (iเป็นจำนวนเต็ม, nเป็นจำนวนนับ)โดยใช้รูปแบบ S(i) = i+1 ชุดลำดับของ i+n ได้แก่ i+0, i+1, i+2, i+3,… Base case คือ S(0) = i Recursive part คือ S(n) = S(n-1)+1 จะได้ว่า S(0) = i S(1) = S(0) +1 = i+1 S(2) = S(1) +1 = (i+1)+1 = i+2 S(3) = S(2) +1 = (i+2)+1 = i+3 … Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 8
∑0≤i≤nai (สำหรับอนุกรมของจำนวน {ai}) • Base case คือ • Recursive part คือ • จะได้ว่า Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 9
The Fibonacci Series อนุกรมไฟโบแนซซี(Fibonacci series)fn≥0นิยามโดย:f0 :≡ 0, f1 :≡ 1, fn≥2 :≡ fn−1 + fn−2 f(0) = 0 f(1) = 1 f(2) = f(1) + f(0) = 1 + 0 = 1 f(3) = f(2) + f(1) = 1 + 1 = 2 f(4) = f(3) + f(2) = 2 + 1 = 3 . . . f(4) f(3) f(2) f(2) f(0) f(1) f(1) f(1) f(0) Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 10 10
Recursive Euclid’s Algorithm proceduregcd(a,bN,nonnegative integer with a>b)ifb = 0 thenreturn aelse returngcd(b,amodb) สังเกตว่าอัลกอริธึมแบบเรียกซ้ำจะทำให้เขียนโปรแกรมได้สั้นกว่าง่ายกว่าและง่ายต่อการทำความเข้าใจมากกว่า แต่การเขียนโปรแกรมแบบเรียกซ้ำจะใช้พื้นที่ในหน่วยความจำที่เรียกว่าสแตก(stack)มากกว่าการเขียนโปรแกรมแบบวนลูป สำหรับอัลกอริธึมแบบเรียกซ้ำ(Recursive)ใดๆ จะมีอัลกอริธึมแบบวนลูป(Iterative)ที่สมมูล(ให้ผลลัพธ์ที่เหมือนกัน)กันเสมอ อย่างไรก็ตาม อัลกอริธึมแบบวนลูปมักจะมีประสิทธิภาพมากกว่าในแง่ของการใช้พื้นที่และเวลาที่น้อยกว่าอัลกอริธึมแบบเรียกซ้ำ Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 11 11
Recursive Fibonacci Algorithm procedurefibo(n: nonnegative integer) if n 1 then returnn else returnfibo(n – 1) + fibo(n – 2) Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 12 12
Iterative Fibonacci Algorithm procedure iterative_fibo(n: nonnegative integer) if n = 0 theny := 0 else begin x := 0 y := 1 fori := 1 to n-1 begin z := x + y x : = y y := z end end{y is the n-th Fibonacci number} Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 13 13
Recursive Algorithms ตัวอย่าง: อัลกอริธึมสำหรับการคำนวณค่าan procedurepower(a≠0: real, nN) ifn = 0 then return 1elsereturna · power(a, n−1) จงเขียนอัลกอริธึมคำนวณค่าanเดียวกันนี้แบบเรียกซ้ำ Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 14 14
Recurrence Relations Faculty of Informatics, Burapha University ภาควิชาวิทยาการคอมพิวเตอร์ ม.บูรพา 15 15
Recurrence Relations • ความสัมพันธ์เวียนเกิด(recurrence relation)ของลำดับ{an}คือสมการที่แสดงanในรูปของสมาชิกก่อนหน้าa0, …, an−1ของลำดับนั้นๆสำหรับทุกค่าn≥n0 • จะเห็นว่า ความสัมพันธ์เวียนเกิดนั้นนิยามได้เช่นเดียวกับ การนิยามแบบเรียกซ้ำแตกต่างกันที่ไม่มีกรณีพื้นฐาน(base cases) • เราสามารถใช้ ลำดับใดๆที่ไม่อยู่ในรูปของการเรียกซ้ำ เป็นผลเฉลยของความสัมพันธ์เวียนเกิดที่กำหนดได้ หากลำดับดังกล่าวสอดคล้องกับนิยามของการเวียนเกิด • ความสัมพันธ์เวียนเกิดหนึ่งๆ อาจมีผลเฉลยได้มากกว่าหนึ่งผลเฉลย Faculty of Informatics, Burapha University
Recurrence Relation Example • พิจารณาความสัมพันธ์เวียนเกิด an = 2an−1 − an−2 (n≥2) • ลำดับต่อไปนี้เป็นผลเฉลยของความสัมพันธ์ข้างต้นหรือไม่?an = 3nan = 2n an = 5 Yes No Yes Faculty of Informatics, Burapha University
Recurrence Relations ตัวอย่าง:พิจารณาความสัมพันธ์เวียนเกิดan = 2an-1 – an-2 for n = 2, 3, 4, … • ลำดับ {an} เมื่อ an=3n เป็นผลเฉลยของความสัมพันธ์เวียนเกิดที่กำหนดหรือไม่? สำหรับ n 2 จะได้ว่า2an-1 – an-2 = 2(3(n – 1)) – 3(n – 2) = 3n = an • ดังนั้น {an} เมื่อ an=3n เป็นผลเฉลยของความสัมพันธ์เวียนเกิดที่กำหนด • ลำดับ {an} เมื่อ an=5 เป็นผลเฉลยของความสัมพันธ์เวียนเกิดข้างต้นหรือไม่? • เมื่อ n 2 จะได้ว่า2an-1 – an-2 = 25 - 5 = 5 = an • ดังนั้น {an} เมื่อ an=5 เป็นผลเฉลยของความสัมพันธ์เวียนเกิดข้างต้น Faculty of Informatics, Burapha University
Modeling with Recurrence Relations ตัวอย่าง: • นายภักดี ฝากเงิน 10,000 บาทไว้ในบัญชีออมทรัพย์ ที่ให้ดอกเบี้ย 5% ต่อปี สะสมไว้เป็นเงินฝากต่อไปทุกปี เมื่อเวลาผ่านไป 30 ปีเงินในบัญชีเงินฝากของนายภักดีจะเป็นเท่าไร? วิธีทำ: • ให้ Pnแทนจำนวนเงินในบัญชีหลังจากเวลาผ่านไป n ปี • จงเขียน Pnในรูปของ Pn-1? Faculty of Informatics, Burapha University
Modeling with Recurrence Relations • เราสามารถเขียนความสัมพันธ์เวียนเกิดของ Pn ในรูปของ Pn-1 ได้ดังนี้: Pn = Pn-1 + 0.05Pn-1 = 1.05Pn-1 เงื่อนไขเริ่มต้น คือ P0 = 10,000 ดังนั้น จะได้ว่า: P1 = 1.05P0 P2 = 1.05P1 = (1.05)2P0 P3 = 1.05P2 = (1.05)3P0 … Pn = 1.05Pn-1 = (1.05)nP0 • จะเห็นว่า ได้สูตรสำหรับคำนวณค่า Pnสำหรับจำนวนนับ n ใดๆได้ โดยไม่จำเป็นต้องทำการคำนวณเรียกซ้ำหลายครั้ง Faculty of Informatics, Burapha University
Modeling with Recurrence Relations จึงสามารถใช้สูตรที่หาได้คำนวณหา P30ภายใต้เงื่อนไขเริ่มต้น P0 = 10,000: P30 = (1.05)3010,000 = 43,219.42 ดังนั้นเมื่อผ่านไป 30 ปี เงินฝากในบัญชีจะมีเงินทั้งหมด 43,219.42 บาท Faculty of Informatics, Burapha University 21
Example Applications and Solving Compound Interest RR • ความสัมพันธ์เวียนเกิดของการฝากเงินธนาคารที่อัตราดอกเบี้ยP% ต่อช่วงเวลาที่กำหนด: Mn = Mn−1 + (P/100)Mn−1 • Mn = Mn−1 + (P/100)Mn−1 = (1 + P/100) Mn−1 = rMn−1(ให้r = 1 + P/100) = r (rMn−2) = r·r·(rMn−3) …เช่นนี้ไปเรื่อยๆ… = rnM0 Faculty of Informatics, Burapha University
Modeling with Recurrence Relations • ความสัมพันธ์เวียนเกิดที่เป็นที่รู้จักกันดีอันหนึ่งในกลุ่ม นักคณิตศาสตร์ คือ ปัญหาของ Leonard diPisa ซึ่งรู้จักกันในนาม Fibonacci โดยFibonacci ได้ตั้งปัญหาในหนังสือ Liber abaci ราว ๆ คริสตศตวรรษที่13 ดังนี้ “กระต่ายแรกเกิดเพศผู้และเพศเมียคู่หนึ่งถูกนําไปปล่อยไว้ที่เกาะแห่งหนึ่ง อยากทราบว่าจะมีกระต่ายทั้งหมดกี่คู่ เมื่อเวลาผ่านไป n เดือน โดยมีข้อสมมติว่า เมื่อกระต่ายทั้งสองมีอายุครบ 2 เดือนจึงจะสามารถให้กําเนิดกระต่ายเพศผู้และเพศเมียอีก 1 คู่ และเมื่อจุดเริ่มต้นบนเกาะนั้นไม่มีกระต่ายอยู่เลย” Faculty of Informatics, Burapha University
Modeling with Recurrence Relations กระต่ายที่เกิดใหม่ กระต่ายที่มีอยู่เดิม Faculty of Informatics, Burapha University
Modeling with Recurrence Relations กําหนดให้fnเป็นจํานวนคู่ของกระต่าย เมื่อตอนต้นเดือนที่ n สังเกตจากภาพที่ 1 จะเห็นว่า จํานวนกระต่ายเมื่อต้นเดือนที่ 3 เท่ากับจํานวน กระต่ายเมื่อต้นเดือนที่ 2 บวกกับจํานวนกระต่ายเมื่อต้นเดือนที่ 1 และจํานวน กระต่ายเมื่อต้นเดือนที่ 4 เท่ากับจํานวนกระต่ายเมื่อต้น เดือนที่ 3 บวกกับจํานวน กระต่ายเมื่อต้นเดือนที่ 2 เป็นเช่นนี้เรื่อย ๆ ไป ดังนั้น fn = fn-1 + fn-2 ถ้าเรากําหนด f0 = 0 และเราทราบว่า f1 = 1 แล้วสมการข้างต้น สําหรับ n 2 ดังนั้น f2 = f1 + f0 = 2 f3 = f2 + f1 = 3 f4 = f3 + f2 = 5 f5 = f4 + f3 = 8 Faculty of Informatics, Burapha University
Modeling with Recurrence Relations ตัวอย่าง: • ให้ anแทนจำนวนบิตสตริงยาว n ที่ไม่มีเลข 0 ติดกัน(ในที่นี้จะเรียกว่า“สตริงที่ถูกต้อง”)จงเขียนความสัมพันธ์เวียนเกิด และกำหนดเงื่อนไขเริ่มต้นสำหรับลำดับ {an} วิธีทำ: • แนวคิด: จำนวนของสตริงที่ถูกต้อง หาได้จากจำนวนของสตริงที่ถูกต้องที่ลงท้ายด้วยเลข 1 หนึ่งตัว บวกกับจำนวนของสตริงที่ถูกต้องที่ลงท้ายด้วยเลข 0 หนึ่งตัว Faculty of Informatics, Burapha University
Modeling with Recurrence Relations • สมมติให้ n 3, เพื่อกำหนดให้สตริงยาวอย่างน้อย 3 บิต กรณีที่ 1 • สมมติต่อไปอีกว่า เราทราบว่ามีบิตสตริงที่ถูกต้องจำนวน an-1ที่ยาว(n – 1) ดังนั้นมีกี่บิตสตริงที่ยาว n ที่ลงท้ายด้วยเลข 1 หนึ่งตัว? • ตอบจะมีสตริงดังกล่าวจำนวนan-1สตริง, ซึ่งก็คือเซตของสตริงที่ถูกต้องที่ยาว(n – 1)และสตริงเหล่านั้นต่อท้ายด้วยเลข1หนึ่งตัว • สังเกตว่า:เมื่อใดก็ตามที่เราเพิ่มเลข 1หนึ่งตัวต่อท้ายสตริงที่ถูกต้อง สตริงที่ได้ก็ยังคงเป็นสตริงที่ถูกต้องเช่นเดิม Faculty of Informatics, Burapha University
Modeling with Recurrence Relations กรณีที่ 2 สิ่งที่เราจำเป็นต้องทราบต่อไปคือ: มีสตริงที่ถูกต้องที่ยาวnและลงท้ายด้วยเลข 0หนึ่งตัวกี่บิตสตริง? • สตริงที่ถูกต้องที่ยาว nซึ่งลงท้ายด้วยเลข0หนึ่งตัว ต้องมีเลข 1ในบิตที่(n – 1) (ไม่เช่นนั้นสตริงเหล่านั้นจะลงท้ายด้วย 00 ซึ่งจะเป็นสตริงที่ไม่ถูกต้อง) • และมีบิตสตริงที่ถูกต้องที่ยาว(n – 1)ซึ่งลงท้ายด้วยเลข 1 หนึ่งตัวกี่บิตสตริง? • เราทราบอยู่แล้วว่ามีan-1สตริงที่ยาว nซึ่งลงท้ายด้วยเลข 1 หนึ่งตัว(จากกรณีที่ 1) • ดังนั้น มี an-2บิตสตริงที่ยาว(n – 1) ซึ่งลงท้ายด้วยเลข 1 หนึ่งตัว Faculty of Informatics, Burapha University
Modeling with Recurrence Relations • ดังนั้นมีสตริงที่ถูกต้องจำนวนan-2ที่ยาวnซึ่งลงท้ายด้วยเลข 0 หนึ่งตัว(สตริงที่ถูกต้องทั้งหมดที่ยาว (n – 2) และต่อท้ายด้วยเลข 10 ) • ดังที่กล่าวแล้วข้างต้น จำนวนของสตริงที่ถูกต้อง คือจำนวนของบิตสตริงที่ถูกต้องที่ลงท้ายด้วยเลข1หนึ่งตัวบวกกับจำนวนของสตริงที่ถูกต้องที่ลงท้ายด้วยเลข0 หนึ่งตัว • ดังนั้นจึงได้ความสัมพันธ์เวียนเกิด ดังนี้: an = an-1 + an-2 Faculty of Informatics, Burapha University
Modeling with Recurrence Relations • เงื่อนไขเริ่มต้นคืออะไร? • a1 = 2 (0 และ 1) • a2 = 3 (01, 10, และ 11) • a3 = a2 + a1 = 3 + 2 = 5 • a4 = a3 + a2 = 5 + 3 = 8 • a5 = a4 + a3 = 8 + 5 = 13 • … • ลำดับเหล่านี้เป็นไปตามความสัมพันธ์เวียนเกิดของ Fibonacci sequence • เพราะ a1 = f3และ a2 = f4, จะได้ว่า an = fn+2 Faculty of Informatics, Burapha University
Tower of Hanoi Example • นิยายปรัมปราเกี่ยวกับหอคอยแห่งฮานอยเล่าว่าพระที่ประจําอยู่ในหอคอยแห่งฮานอยประกาศว่า ถ้าท่านจะย้ายแผ่นทองคําจํานวน 64 แผ่น ที่เรียงอยู่ที่เสาต้นหนึ่งโดยมีแผ่นทองคำขนาดใหญ่อยู่ด้านล่างและแผ่นทองที่มีขนาดเล็กกว่าอยู่ด้านบน ไปยังวางเรียงไว้ที่เสาอีกต้นหนึ่งในลักษณะเดียวกัน โดยในการย้ายแผ่นทองคํา 1 แผ่น ใช้เวลา 1 วินาที แล้วเมื่อท่านย้ายแผ่นทองคําจากเสาต้นที่ 1 ไปยังเสาต้นอื่นเสร็จสิ้น โลกก็จะแตกสลายไปแล้ว Faculty of Informatics, Burapha University
Tower of Hanoi Example • ปัญหา: ย้ายแผ่นดิสก์จากหลักที่ 1 ไปยังหลักที่ 2 • กฎ: (a) แต่ละครั้งย้ายได้เพียงแผ่นเดียว • (b) แผ่นดิสก์ที่ใหญ่กว่าจะอยู่บนแผ่นที่เล็กกว่าไม่ได้ หลัก #1 หลัก #2 หลัก #3 Faculty of Informatics, Burapha University
Hanoi Recurrence Relation • ให้Hn= จำนวนครั้งของการย้ายแผ่นดิสก์ nแผ่น วิธีการย้ายแผ่นดิสก์: • ย้ายแผ่นดิสก์n−1แผ่นที่อยู่ด้านบนไปยังหลักอื่นๆ (มีการย้ายแผ่นHn−1ครั้ง) • ย้ายแผ่นดิสก์ที่อยู่ด้านล่าง(ย้าย 1 ครั้ง) • ย้ายแผ่นดิสก์n−1แผ่นที่อยู่ด้านบน(ที่ย้ายไปไว้ยังหลักอื่น)ไปไว้บนแผ่นที่อยู่ด้านล่าง (มีการย้ายแผ่นHn−1ครั้ง) • สังเกตว่า:Hn = 2Hn−1 + 1 • จำนวนครั้งของการย้ายแผ่นดิสก์สามารถอธิบายได้ด้วยความสัมพันธ์เวียนเกิด Faculty of Informatics, Burapha University
Solving Tower of Hanoi RR Hn = 2 Hn−1 + 1 = 2 (2 Hn−2 + 1) + 1 = 22 Hn−2 + 2 + 1 = 22(2 Hn−3 + 1) + 2 + 1 = 23Hn−3 + 22 + 2 + 1 … = 2n−1H1 + 2n−2 + … + 2 + 1 = 2n−1 + 2n−2 + … + 2 + 1 (เพราะH1 = 1) = = 2n − 1 Faculty of Informatics, Burapha University
Solving Tower of Hanoi RR • จะได้ว่า จํานวนครั้งของการย้ายแผ่นทองคําจํานวน 64 แผ่น H64 = 264- 1 = 18,446,774,073,709,551,615 • ซึ่งถ้าย้าย 1 แผ่นใช้เวลา 1 วินาที แล้วจะใช้เวลาทั้งหมดมากกว่า 500 พันล้านปีทีเดียว Faculty of Informatics, Burapha University