ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
290214 Data Structures and Algorithms
การเรียกซ้ำ (Recursion) อ.ธารารัตน์ พวงสุวรรณ คณะวิทยาศาสตร์และศิลปศาสตร์ มหาวิทยาลัยบูรพา วิทยาเขตสารสนเทศจันทบุรี
2
เนื้อหา ความแตกต่าง ของ Iterative Solution และ Recursive Solution
การนิยามแบบ Recursion Recursive Example Greatest Common Divisor (GCD) Fibonacci Numbers Towers of Hanoi
3
Approach to writing Repetition Algorithms
Use Iteration Use Recursion Recursion is a repetitive process in which an algorithm calls itself Some older languages do not support recursion
4
A Classic Recursive Case
Factorial เป็น case study Factorial(n) = if n=0 n x (n-1) x (n-2) x ... x 3 x 2 x 1 if n >0
5
การหาค่าแฟกทอเรียล n! = 1 * 2 * 3 * 4 * ...* n เช่น 4! = 4 * 3 * 2 * 1
3! = 3 * 2 * 1 2! = 2 * 1 1! = 1
6
Iterative Factorial Algorithm
Algorithm iterativeFactorial (n) Calculates the factorial of a number using a loop Pre n is the number to be raised factoriallly Post n! is returned Return factN เป็นค่า n! set i to 1 set factN to 1 3 loop(i <= n) set factN to factN * i increment i 4 end loop 5 return factN end iterativeFactorial
7
Recursive Factorial Algorithm
Algorithm recursiveFactorial (n) Calculates factorial of a number using recursion Pre n is the number to be raised factoriallly Post n! is returned Return ค่า n! if (n equal 0) return 1 2 else return (n * recursiveFactorial (n-1)) 3 end if end recursiveFactorial
8
Recursive Programming
คือ การเขียนโปรแกรมที่ฟังก์ชันในโปรแกรมนั้นมีการเรียกใช้งาน ตัวมันเอง (Call itself) เรียกฟังก์ชันที่มีการเรียกใช้งานตัวมันเองว่า “Recursive Function” บางปัญหาสามารถที่จะเขียนในรูปแบบของ recursion จะง่ายกว่า หลักการแก้ปัญหาในรูปแบบ recursion 1. นิยามปัญหาในรูปการเรียกตัวเอง 2. มีเงื่อนไขสำหรับจบการทำงาน “One important requirement for a recursive algorithm to be correct is that it not generate an infinite sequence of call on itself”
9
ลักษณะของ recursive function
call itself directly call itself indirectly หรือเรียกว่า Recursive chains ตัวอย่างของ Recursive chains a(formal parameters) b(formal parameters) { { b(arguments); a(arguments); } /* end a */ } /* end b */ “Both a and b are recursive”
10
ตัวอย่าง int main(void) { printf(“The universe is never ending\n”);
return 0; } //an infinite sequence of call on itself
11
การคำนวณหาค่าแฟกทอเรียลของจำนวนเต็มบวก
การนิยามแบบ iterative n! = n * (n-1) * (n-2) * ... 1 อาจเขียนคำจำกัดความของฟังก์ชัน ได้ว่า n! = 1 if n ==0 n! = n * (n-1) * (n-2) * ... * 1 if n > 0
12
Iterative programming
//Function for calculating factorial of integer long int fact(int n) { int x; prod = 1; for(x = n; x > 0; x--) prod = prod * x; return(prod); }
13
การนิยามแบบ Recursion
เขียนปัญหาในรูปการเรียกตัวเอง n! = n * (n-1)! อาจเขียนคำจำกัดความของฟังก์ชัน ได้ว่า n! = 1 if n ==0 n! = n * (n-1)! if n > 0 2. หาเงื่อนไขสำหรับจบการทำงาน คือ เมื่อเรียกตัวเองจนถึง 0! = 1
14
Recursive programming
//Function for calculating factorial of integer long int fact(int n) { if(n == 0) //condition for end calling itself return(1) else return(n * fact(n-1)); } Recursion
15
Recursive programming
“Recursive function จะทำงานในลำดับที่กลับกันกับเวลาเรียกใช้” จากโปรแกรมหาค่าแฟกทอเรียลแบบ recursion การเรียกใช้จะเป็นลำดับดังนี้ n! = n * (n-1)! (n-1)! = (n-1) * (n-2)! (n-2)! = (n-2) * (n-3)! 2! = 2 * 1! 1! = 1 * 0! 0! = 1
16
Recursive programming
ค่าที่ส่งกลับมาจะเป็นลำดับที่กลับกัน ดังนี้ 0! = 1 1! = 1 * 0! = 1 2! = 2 * 1! = 2 * 1 = 2 3! = 3 * 2! = 3 * 2 = 6 4! = 4 * 3! = 4 * 6 = 24 n! = n * (n-1)! =
17
Recursive programming
ดังนั้น ส่ง 4 เข้าไปให้ฟังก์ชัน พอเรียกฟังก์ชัน จะได้ return(4 * return(3 * return(2 * return(1 * return(1); จะเห็นว่า ค่าส่งกลับจะเป็น return(4*3*2*1*1)
18
Recursive Example เป็นตัวอย่างของการแก้ปัญหาแบบ Recursion
Greatest Common Divisor (GCD) Fibonacci Numbers Towers of Hanoi
19
Greatest Common Division(GCD)
เป็นฟังก์ชันทางคณิตศาสตร์ ที่รู้จักกันว่า การหาตัวหารร่วมมาก (ห.ร.ม.) gcd ของจำนวนเต็มซึ่งไม่เป็น 0 พร้อมกัน คือจำนวนเต็มที่มากที่สุดที่หารทั้งสองจำนวนลงตัว เช่น gcd ของ 10 กับ 25 คือ 5 มีประโยชน์ในการทำเศษส่วนให้เป็นเศษส่วนอย่างต่ำ ใช้ Euclidean Algorithm ในการหา gcd ของจำนวนเต็มที่ไม่เป็นค่าลบ
20
Greatest Common Division(GCD)
gcd (a,b) = a if b = 0 b if a = 0 gcd (b, a mod b) otherwise
21
Greatest Common Division(GCD)
Algorithm gcd (a, b) Calculates greatest common division using the Euclidean algorithm Pre a and b are positive integers greater than 0 Post greatest common divisor returned Return greatest common divisor returned end gcd
22
การหา Fibonacci numbers
การหาชุดของ Fabonacci series จะต้องทราบตัวเลข 2 ตัวแรก นิยาม Fib(n) = n if n = 0 or n = 1 Fib(n) = Fib(n-1) + Fib(n-2) if n > 1
23
Fibonacci numbers เขียนเป็น recursive function ได้ว่า int fib(int n) {
int x,y; if(n<= 1) return(n); x = fib(n-1); y = fib(n-2); return(x+y); }
24
ต้องการเคลื่อนย้าย disk ทั้งหมดไปไว้อีก peg หนึ่ง
Tower of Hanoi Problem B C A เป้าหมาย ต้องการเคลื่อนย้าย disk ทั้งหมดไปไว้อีก peg หนึ่ง ข้อกำหนด เคลื่อนย้ายครั้งละ 1 disk เท่านั้นโดยเคลื่อนย้ายจาก disk บนสุดก่อน - ไม่อนุญาตให้ disk ที่ใหญ่กว่าซ้อนบน disk ที่เล็กกว่า
25
จากรูปดังกล่าว หากเราต้องการเคลื่อนย้าย disk ทั้งหมดจาก A ไป C
Recursive solution for Towers of Hanoi Problem if n==1, move the single disk from A to C and stop 2. Move the top n-1 disks from A to B, using C as auxiliary 3. Move the remaining disk from A to C 4. Move the n-1 disks from B to C, using A as auxiliary
26
A B C A B C
27
A B C A B C
28
โดยทั่วไป โปรแกรมที่มีลักษณะ nonrecursive การประมวลผลจะมี
Efficiency of recursion โดยทั่วไป โปรแกรมที่มีลักษณะ nonrecursive การประมวลผลจะมี มีประสิทธิภาพดีกว่าโปรแกรมที่มีลักษณะ recursive ในด้านของเวลาและพื้นที่ หน่วยความจำ (space) แต่ลักษณะบางโปรแกรมก็เหมาะที่จะเขียนแบบ recursive เพราะจะทำให้ง่ายกว่าและเกิดข้อผิดพลาดได้น้อยกว่าแบบ nonrecursive ข้อดีของ recursive programming - เขียนได้สั้น ง่าย - มองเห็นแนวทางการแก้ปัญหาได้ชัดเจน - ใช้เวลาไม่มากในการเขียนโปรแกรม
29
ข้อเสียของ recursive programming
จากทำให้มีการทำงานที่ซ้ำซ้อน เช่น การหา Fibonacci number Fib(n) = n if n = 0 or n = 1 Fib(n) = Fib(n-1) + Fib(n-2) if n > 1 ตัวอย่าง Fib(5) = Fib(4) + Fib(3) Fib(4) = Fib(3) + Fib(2) Fib(3) = Fib(2) + Fib(1) Fib(2) = Fib(1) + Fib(0)
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.