หน่วยที่ 5 การเวียนเกิด กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
การเรียกตัวเอง (Recursion Algorithm ) Base case คือวิธีที่สามารถสรุปหาคำตอบในลักษณะธรรมดา เช่น คำตอบอาจเป็นค่าคงที่ที่กำหนดไว้แล้ว หรือคำตอบนั้นอาจได้มาจากการคำนวณโดยตรง เป็นต้น Recursive cases คือวิธีการหาคำตอบซึ่งจะต้องทำด้วยวิธีการทำซ้ำหลักการเดิมที่ใช้แก้ปัญหา
การเรียกตัวเอง (Recursion Algorithm ) เมื่อผ่านกรรมวิธีแก้ปัญหาแบบเรียกตัวเองแล้ว ปัญหาจะถูกแบ่งออกเป็นส่วนย่อย ๆ จำนวนมาก ซ้อนกันเป็นชั้น ๆ แต่ละชั้นใช้วิธีการแก้ปัญหาแบบเดียวกัน จนกระทั่งกลายเป็นปัญหาย่อยเล็กที่สุดที่สามารถหาคำตอบได้ด้วยกรณีของ base case แล้ว จะทำให้สามารถหาคำตอบย้อนกลับของปัญหากรณีของ recursive case ที่ใหญ่ขึ้นเรื่อย ๆ จนได้คำตอบของปัญหาทั้งหมด
การเรียกตัวเอง (Recursion Algorithm ) Main Proc 1 Proc 2 Proc 3 คำตอบ 1 Proc 4 การเรียกตัวเองทางอ้อม Proc1 เรียกใช้ Proc3 Proc3 เรียกฝช้ Proc5 Proc5 เรียกใช้ Proc1 คำตอบ 2 Proc 5 การเรียกตัวเองโดยตรง Proc4 เรียกใช้ Proc4
Factorial function n factorial (n!) คือผลคูณของเลขจำนวนเต็มบวกตั้งแต่ 1 ถึง n เช่น 3! = 1*2*3 4! = 1*2*3*4 n! = 1*2*3*4*…*(n-2)*(n-1)*n หรือ n! = n*(n-1)*(n-2)*…*4*3*2*1 และกำหนดให้ 0!=1
Factorial function เราสามารถกำหนดให้ 4! เป็นแบบรีเคอร์ซีฟ ได้ดังนี้ 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*0! 0!=1 1!=1*1=1 2!=2*1=2 3!=3*2=6 4!=4*6=24
Factorial function สรุปได้ว่า n!=n*(n-1)! (n-1)!=(n-1)*(n-2)! ……… 0!=1 ดังนั้น เราจึงสามารถหาคำตอบของ n! ได้เป็น 2 กรณีคือ 1. ถ้า n มีค่าเท่ากับ 0 คำตอบที่ได้คือ n!=1 (base case) 2. ถ้า n มีค่ามากกว่า 0 คำตอบที่ได้คือ n!=n*(n-1)! (recursive case)
Factorial function อัลกอริทึมการหาค่า n! Function FACTORIAL(n) 1. if n = 0 then set FACTORIAL = 1 else 2. set FACTORIAL = n * FACTORIAL (n-1) 3. RETURN
Fibonacci function ลำดับของไฟโบนักซีเป็นดังนี้ 0,1,1,2,3,5,8,13,… ลำดับของไฟโบนักซีเป็นดังนี้ 0,1,1,2,3,5,8,13,… กำหนดให้ Fib(0)=0 และ Fib(1)=1 การคำนวณแต่ละเทอมของผลบวกของเลขไฟโบนักซีก่อนหน้าสองตัวทำได้ดังตัวอย่างต่อไปนี้ Fib(3)=Fib(2)+Fib(1)=1+1=2 Fib(6)=Fib(5)+Fib(4)=5+3=8 ดังนั้น ลำดับของไฟโบนักซีสามารถกำหนดได้ดังนี้ Fib(0)=0 Fib(1)=1 Fib(n)=Fib(n-1)+Fib(n-2) สำหรับ n>=2 (Recursive case) (Base case)
Fibonacci function อัลกอริทึมการหาค่า Fibonacci ของ n 1. if (n=0) or (n=1) then set FIBONACCI = n else 2. set FIBONACCI = FIBONACCI(n-1)+FIBONACCI(n-2) 3. RETURN
Fibonacci function F(0) = 0 F(1) = 1 F(2) = F(1) + F(0) = 1+0 = 1 … … …
Ackermann Function ถ้า m = 0 คำตอบของค่า A(0,n) = n+1 เป็นฟังก์ชั่นที่มีองค์ประกอบของเลขจำนวนเต็มบวก 2 ตัว คือ m,n โดยที่ m,n มีค่าตั้งแต่ 0,1,2,… การหาคำตอบใช้เทคนิค BackTracking คือถ้าต้องการหาค่าของข้อมูลตัวใด จะต้องค้นหาข้อมูลตัวอื่นที่มีความเกี่ยวเนื่องกับข้อมูลตัวนั้นทั้งหมดให้ได้ก่อน โดยเงื่อนไขการหาคำตอบมีดังนี้ ถ้า m = 0 คำตอบของค่า A(0,n) = n+1 ถ้า m 0 แต่ n = 0 ; A(m,0) = A(m-1,1) ถ้า m 0 และ n 0 ; A(m,n) = A(m-1,A(m,n-1))
Ackermann Function Function ACKERMANN(m,n) 1. if m = 0 then set ACKERMANN = n+1 else 2. if (m<>0) and (n=0) then set ACKERMANN = ACKERMANN(m-1,1) 3. if (m<>0) and (n<>0) then set ACKERMANN = ACKERMANN(m-1, ACKERMANN (m,n-1)) 4. RETURN
Ackermann Function แสดงวิธีการหาค่า Ackermann Function ของ A(1,3) A(1,3) = A(0,A(1,2)) A(1,2)=A(0,A(1,1)) A(1,1)=A(0,A(1,0)) A(1,0)=A(0,1) A(0,1)=1+1=2 A(1,0)=2 A(1,1)=A(0,2)=2+1=3 A(1,2)=A(0,3)=3+1=4 A(1,3)=A(0,4)=4+1=5
Tower of Hanoi หอคอยฮานอย (Tower of Hanoi) คือ ปัญหาของการย้ายแผ่นจานขนาดต่างๆ จากหลักหนึ่ง ไปยังอีกหลักหนึ่ง โดยมีหลักสำหรับวางซ้อนจานอยู่ 3 หลัก (สมมติให้เป็นหลัก A,B,C) โดยกำหนดเงื่อนไขในการเคลื่อนย้ายแผ่นจานดังนี้
Tower of Hanoi เคลื่อนย้ายจานได้ครั้งละ 1 แผ่น ที่อยู่ด้านบนสุดเท่านั้น แผ่นใหญ่ไม่สามารถซ้อนทับแผ่นเล็กได้ กรณี n=1 ถ้าต้องการย้ายจานจาก หลัก A ไปหลัก C อาจเขียนในรูปคำสั่งได้เป็น Tower_Move(1,A,B,C) ดังนั้น กรณีที่ n =2,3,4, … จะต้องทำ 3 ขั้นตอนต่อเนื่อง คือ Tower_Move(n-1,A,C,B) Tower_Move(n-1,B,A,C)
Tower of Hanoi Function TOWER_MOVE(n,A,B,C) 1. if n = 1 then Move A to C and RETURN 2. TOWER_MOVE(n-1,A,C,B) 3. Move A to C 4. TOWER_MOVE(n-1,B,A,C) 5. RETURN
แบบฝึกหัด จงแสดงกรรมวิธีคำนวณหาค่าของ 8! ด้วยวิธีเรียกตัวเอง จงแสดงกรรมวิธีการหาค่าอนุกรม Fibonacci จงแสดงกรรมวิธีหาค่า Ackermann Function ของ A(3,5) จงแสดงขั้นตอนการเคลื่อนย้ายแผ่นจานในปัญหาหอคอยฮานอย เมื่อกำหนดให้ n=4