Data Structures and Algorithms

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
บทที่ 2 รหัสควบคุมและการคำนวณ
Advertisements

รายวิชา ง40102 หลักการแก้ปัญหาและการโปรแกรม
Number Theory (part 1) ง30301 คณิตศาสตร์ดิสครีต.
รายวิชา ง40206 โครงสร้างข้อมูลและขั้นตอนวิธี
Control Statement if..else switch..case for while do-while.
สายอักขระและ การประมวลผลสายอักขระ (String and String manipulation)
บทนิยาม1.1 ให้ m, n น 0 เป็นจำนวนเต็ม n หาร m ลงตัวก็ต่อเมื่อ มี c ฮ Z ซึ่ง m = nc เรียก n ว่า ตัวหาร (divisor) ตัวหนึ่งของ m ใช้ n|m แทน " n หาร m ลงตัว.
Chapter 1 โครงสร้างข้อมูลและอัลกอริธึมส์
Control structure part II
Functional programming part II
Data Structures and Algorithms
Object-Oriented Analysis and Design
Lecture 13: ฟังก์ชันเรียกตัวเอง
Stack Holidays/seasonal content.
Structure Programming
Structure Programming
ทฤษฎีจำนวนเบื้องต้น โดย ครูภรเลิศ เนตรสว่าง โรงเรียนเทพศิรินทร์
ลักษณะการทำงานของ Stack
Function.
ผศ.ดร.เจษฎา ตัณฑนุช โทร
คณิตศาสตร์ธุรกิจ วันอังคาร 9:00-12:00 น. กลุ่ม 1 ห้อง B1138
Repetitive Instruction
คำสั่งควบคุมการทำงาน
การจำลองความคิด
คำสั่งแบบมีเงื่อนไข IF Statement
การควบคุมทิศทางการทำงานของโปรแกรม
การเขียนผังงานแบบโครงสร้าง
คำศัพท์ที่น่าสนใจใน A5
Repetitive Or Iterative
Asst.Prof. Dr.Surasak Mungsing
หน่วยที่ 4: คำสั่งควบคุมโปรแกรม (Control Flow Command)
บทที่ 7 รีเคอร์ซีฟ ระหว่างการออกแบบเขียนโปรแกรมแบบบนลงล่าง (Top-down Design) จะมีงานย่อย(Subtask) เพื่อแก้ปัญหาในแต่ละเรื่อง และผู้เขียนโปรแกรมต้องการใช้งานย่อยในลักษณะที่เรียกตัวเองขึ้นมาทำงานลักษณะของฟังก์ชั่นมีความรอบรัดสั้นกว่าแบบวนลูป.
คำสั่งควบคุมการทำงาน
Flow Control.
Page: 1 การโปรแกรมเชิงวัตถุด้วยภาษา JAVA บุรินทร์ รุจจนพันธุ์.. ปรับปรุง 15 มิถุนายน 2550 Structure Programming มหาวิทยาลัยเนชั่น.
Chapter 5 คำสั่งควบคุมการทำซ้ำ
Chapter 7 Iteration Statement
โครงสร้างข้อมูลแบบคิว
โครงสร้างควบคุมการทำงาน
ง30212 การเขียนโปรแกรมภาษาคอมพิวเตอร์ โรงเรียนปลวกแดงพิทยาคม
ฟังก์ชัน ง30212 การเขียนโปรแกรมด้วยภาษาคอมพิวเตอร์ ศูนย์คอมพิวเตอร์
คุณสมบัติการหารลงตัว
ค33211 คณิตศาสตร์สำหรับ คอมพิวเตอร์ 5
การหาตัวหารร่วมมาก โดยใช้รูปแบบบัญญัติ
ค33211 คณิตศาสตร์สำหรับ คอมพิวเตอร์ 5
จำนวนเต็มกับการหารลงตัว
ทบทวน กันก่อน .....กระบวนการแปลโปรแกรม
Week 2 Variables.
เสรี ชิโนดม ฟังก์ชัน เสรี ชิโนดม
Computer Programming for Engineers
บทที่ 10 คำสั่งควบคุม OUTLINE 1. คำสั่งแบบเรียงลำดับ (Sequence)
Recursion การเรียกซ้ำ
วิทยา กรระสี (วท.บ. วิทยาการคอมพิวเตอร์)
ฟังก์ชัน.
การใช้ PHP ติดต่อกับ Text File
CHAPTER 4 Control Statements
กองซ้อน ยอดกองซ้อน (stack).
สาขาวิชาเทคโนโลยี สารสนเทศ คณะเทคโนโลยีสารสนเทศ และการสื่อสาร.
Recursive Method.
สาขาวิชาเทคโนโลยี สารสนเทศ คณะเทคโนโลยีสารสนเทศ และการสื่อสาร.
Introduction ธนวัฒน์ แซ่เอียบ.
Function ธนวัฒน์ แซ่ เอียบ. What is a function ฟังก์ชันในภาษา C เป็นโปรแกรมที่ถูกออกแบบมาเพื่อ ใช้แก้ปัญหางานใดงานหนึ่งโดยเฉพาะ ฟังก์ชันจะเปลี่ยน input.
1 Functions กนกวรรธน์ เซี่ยงเจ็น สำนักวิชาเทคโนโลยีสารสนเทศ และการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา.
การรับและแสดงผลข้อมูล (Input/Output)
Function. วัตถุประสงค์การเรียนรู้ ให้รู้จักว่าฟังก์ชันคืออะไร ให้รู้จักว่าเราสร้างฟังก์ชันเพื่อจุดประสงค์ใด หรือ เพื่อประโยชน์ใด ให้รู้จักประเภทของฟังก์ชัน.
Computer Programming การเขียนโปรแกรม คอมพิวเตอร์ สัปดาห์ที่ 6 คำสั่งควบคุมการทำงานแบบ เงื่อนไขและคำสั่งควบคุมการ ทำงานแบบวนซ้ำ.
Week 5 While and Do-While loop (Control Structure 2)
Introduction to Computer Organization and Architecture Flow of Control ภาษาเครื่อง สายงานของการ ควบคุม.
Asst.Prof. Dr.Surasak Mungsing
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 12: เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Dynamic.
ใบสำเนางานนำเสนอ:

290214 Data Structures and Algorithms การเรียกซ้ำ (Recursion) อ.ธารารัตน์ พวงสุวรรณ คณะวิทยาศาสตร์และศิลปศาสตร์ มหาวิทยาลัยบูรพา วิทยาเขตสารสนเทศจันทบุรี thararat@buu.ac.th

เนื้อหา ความแตกต่าง ของ Iterative Solution และ Recursive Solution การนิยามแบบ Recursion Recursive Example Greatest Common Divisor (GCD) Fibonacci Numbers Towers of Hanoi

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

A Classic Recursive Case Factorial เป็น case study Factorial(n) = 1 if n=0 n x (n-1) x (n-2) x ... x 3 x 2 x 1 if n >0

การหาค่าแฟกทอเรียล n! = 1 * 2 * 3 * 4 * ...* n เช่น 4! = 4 * 3 * 2 * 1 3! = 3 * 2 * 1 2! = 2 * 1 1! = 1

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! 1 set i to 1 2 set factN to 1 3 loop(i <= n) 1 set factN to factN * i 2 increment i 4 end loop 5 return factN end iterativeFactorial

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! 1 if (n equal 0) 1 return 1 2 else 1 return (n * recursiveFactorial (n-1)) 3 end if end recursiveFactorial

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”

ลักษณะของ 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”

ตัวอย่าง int main(void) { printf(“The universe is never ending\n”); return 0; } //an infinite sequence of call on itself

การคำนวณหาค่าแฟกทอเรียลของจำนวนเต็มบวก การนิยามแบบ iterative n! = n * (n-1) * (n-2) * ... 1 อาจเขียนคำจำกัดความของฟังก์ชัน ได้ว่า n! = 1 if n ==0 n! = n * (n-1) * (n-2) * ... * 1 if n > 0

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); }

การนิยามแบบ Recursion เขียนปัญหาในรูปการเรียกตัวเอง n! = n * (n-1)! อาจเขียนคำจำกัดความของฟังก์ชัน ได้ว่า n! = 1 if n ==0 n! = n * (n-1)! if n > 0 2. หาเงื่อนไขสำหรับจบการทำงาน คือ เมื่อเรียกตัวเองจนถึง 0! = 1

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

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

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)! = ......

Recursive programming ดังนั้น ส่ง 4 เข้าไปให้ฟังก์ชัน พอเรียกฟังก์ชัน จะได้ return(4 * return(3 * return(2 * return(1 * return(1); จะเห็นว่า ค่าส่งกลับจะเป็น return(4*3*2*1*1)

Recursive Example เป็นตัวอย่างของการแก้ปัญหาแบบ Recursion Greatest Common Divisor (GCD) Fibonacci Numbers Towers of Hanoi

Greatest Common Division(GCD) เป็นฟังก์ชันทางคณิตศาสตร์ ที่รู้จักกันว่า การหาตัวหารร่วมมาก (ห.ร.ม.) gcd ของจำนวนเต็มซึ่งไม่เป็น 0 พร้อมกัน คือจำนวนเต็มที่มากที่สุดที่หารทั้งสองจำนวนลงตัว เช่น gcd ของ 10 กับ 25 คือ 5 มีประโยชน์ในการทำเศษส่วนให้เป็นเศษส่วนอย่างต่ำ ใช้ Euclidean Algorithm ในการหา gcd ของจำนวนเต็มที่ไม่เป็นค่าลบ

Greatest Common Division(GCD) gcd (a,b) = a if b = 0 b if a = 0 gcd (b, a mod b) otherwise

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

การหา 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

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); }

ต้องการเคลื่อนย้าย disk ทั้งหมดไปไว้อีก peg หนึ่ง Tower of Hanoi Problem B C A เป้าหมาย ต้องการเคลื่อนย้าย disk ทั้งหมดไปไว้อีก peg หนึ่ง ข้อกำหนด เคลื่อนย้ายครั้งละ 1 disk เท่านั้นโดยเคลื่อนย้ายจาก disk บนสุดก่อน - ไม่อนุญาตให้ disk ที่ใหญ่กว่าซ้อนบน disk ที่เล็กกว่า

จากรูปดังกล่าว หากเราต้องการเคลื่อนย้าย 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

A B C A B C

A B C A B C

โดยทั่วไป โปรแกรมที่มีลักษณะ nonrecursive การประมวลผลจะมี Efficiency of recursion โดยทั่วไป โปรแกรมที่มีลักษณะ nonrecursive การประมวลผลจะมี มีประสิทธิภาพดีกว่าโปรแกรมที่มีลักษณะ recursive ในด้านของเวลาและพื้นที่ หน่วยความจำ (space) แต่ลักษณะบางโปรแกรมก็เหมาะที่จะเขียนแบบ recursive เพราะจะทำให้ง่ายกว่าและเกิดข้อผิดพลาดได้น้อยกว่าแบบ nonrecursive ข้อดีของ recursive programming - เขียนได้สั้น ง่าย - มองเห็นแนวทางการแก้ปัญหาได้ชัดเจน - ใช้เวลาไม่มากในการเขียนโปรแกรม

ข้อเสียของ 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)