RECURSION Lecture 6 CS2110 – Fall 2013. Overview references to sections in text 2  What is recursion? 7.1-7.39 slide 1-7  Base case 7.1-7.10 slide 13.

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
Texture การประมวลผลภาพแบบดิจิตอล Ian Thomas
Advertisements

จำนวน สถานะ NUMBER OF STATES. ประเด็นที่ สนใจ The number of distinct states the finite state machine needs in order to recognize a language is related.
Data Structures and Algorithms
Data Structures and Algorithms
Stack.
Lecture 13: ฟังก์ชันเรียกตัวเอง
Do Research Prabhas Chongstitvatana Chulalongkorn University 13 September 2013
Asst.Prof. Dr.Surasak Mungsing
ให้ประหยัดการใช้หน่วยความจำ (space) ด้วยความรวดเร็ว (time)
โครงสร้างควบคุมการทำงาน
List ADTs By Pantharee S..
การสร้าง WebPage ด้วย Java Script Wachirawut Thamviset.
Chapter 3 Simple Supervised learning
หลักสูตรอบรมครู คอมพิวเตอร์ หลักสูตรอบรมครู คอมพิวเตอร์ หลักสูตรที่ ๑ ทักษะการโปรแกรม เบื้องต้น วันที่สาม.
In-Class Exercises Discrete Mathematics
Unit 10 As Good As It Gets M ฟังการโฆษณาสินค้า 2. อ่านบทความเกี่ยวกับ ผลิตภัณฑ์ที่มีชื่อเสียง 3. พูดอภิปรายเกี่ยวกับผลิตภัณฑ์ ที่มีชื่อติดอันดับโลก.
Programming & Algorithm
Function ธนวัฒน์ แซ่ เอียบ. What is a function ฟังก์ชันในภาษา C เป็นโปรแกรมที่ถูกออกแบบมาเพื่อ ใช้แก้ปัญหางานใดงานหนึ่งโดยเฉพาะ ฟังก์ชันจะเปลี่ยน input.
Present Continuous.
English for everyday use
ว เคมีพื้นฐาน พันธะเคมี
ปริมาณสัมพันธ์ ผู้สอน อ. ศราวุทธ แสงอุไร Composition Stoichiometry ว ปริมาณสัมพันธ์ สถานะของ สาร และเคมีไฟฟ้า นายศราวุทธ แสงอุไร ครูวิชาการสาขาเคมี
ครูรุจิรา ทับศรีนวล “Room service”. “Room service”
Static Libraries ธวัชชัย เอี่ยมไพโรจน์. Static Libraries It is the simplest form of library. It is a collection of object files kept together in a ready-to-use.
ภาษาอังกฤษ ชั้นมัธยมศึกษาปึที่ 4 Grammar & Reading ครูรุจิรา ทับศรีนวล.
หน่วยที่ 5 การเวียนเกิด
TEST FOR 3RD GRADERS IN THAILAND: COMPARATIVE STUDY Pimlak Moonpo Valaya Alongkorn Rajabhat University under the Patronage Assoc. Prof. Dr. Maitree Inprasitha.
PHP FRAMEWORK – Web Programming and Web Database Asst. Prof. Dr. Choopan Rattanapoka.
Timed Math Quiz. โปรแกรมสุ่มคำนวณเลขแข่งกับ เวลา.
1 exit() and break C++ provides a way to leave a program early (before its natural finish) with the exit() function. The format of exit() is as follows:
Collections. Data structures Data Structures ( โครงสร้างข้อมูล ) เกิดจากการ นำข้อมูลขั้นพื้นฐานที่แบ่งแยกไม่ได้ (atomic data type) เช่น int, char, double.
Linked List ( ต่อ ) Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room.
Practice File. Our Executive Coaching Program is proven effective. Our customer survey show ROI of coaching can be as high as 3 times the investment value.
Page : Stability and Statdy-State Error Chapter 3 Design of Discrete-Time control systems Stability and Steady-State Error.
D 2 E 1 S E M N G ม. I G I T Grammar A L 4.0.
List, Stack, Queue 2018/9/21.
Integrity Constraints
INC 161 , CPE 100 Computer Programming
Data Structure & Algorithm Concept
1. นี่เป็นสิ่งที่พระเยซูทรงทำ พระองค์ทรงรักษาทุกคน ที่เจ็บป่วยให้หายดี
Computer Programming การเขียนโปรแกรมคอมพิวเตอร์
Graph Lecturer : Kritawan Siriboon, Boontee Kruatrachue Room no. 913
Object-Oriented Programming Paradigm
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 13: การคำนวณได้และการตัดสินใจของปัญหา ที่ยากต่อการแก้ไข.
บทที่ 4 ตัวแปร (Variables)
ระเบียบวิธีวิจัยพื้นฐานทางการเงิน
Asst.Prof. Dr.Surasak Mungsing
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 04: การวิเคราะห์หาความซับซ้อนด้านเวลา ในรูป.
Problem Solving ขั้นตอนวิธีและการแก้ปัญหาสำหรับวิทยาการคอมพิวเตอร์
คำเทศนาชุด: ท่านมีของประทาน
Linked List (ต่อ) Lecturer : Kritawan Siriboon, Room no. 913
JavaScript&CSS&DOM.
ระเบียบวิธีวิจัยพื้นฐานทาง การตลาด
ที่มาและหน่วยงานกาชาดต่างๆ
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 05: การวิเคราะห์ความซับซ้อนของ ขั้นตอนวิธีการเรียงลำดับข้อมูล.
แล้วไงเกี่ยวกับความจริง What About Truth?
Data Structures and Algorithms 2/2561
ตอนที่ 4: เคลื่อนไปกับของประทานของท่าน Part 4: Flowing In Your Gift
Recursion Lecture 6 CS2110 – Fall 2013.
Training for SPSS BY Assist. Prof. Benchamat Laksaniyanon, Phd
การวิเคราะห์และออกแบบขั้นตอนวิธี
บทที่ 2 การวัด.
4.7. B-Trees โครงสร้าง tree ที่กล่าวถึงมาแล้วนั้น อยู่บนสมมติฐานที่ว่าโครงสร้างทั้งหมดสามารถจัดเก็บอยู่ในหน่วยความจำของเครื่องคอมพิวเตอร์ได้ ถ้า จำนวนข้อมูลมีปริมาณมากเกินกว่าที่จะเก็บไว้ใน.
โครงการสัมมนาเชิงปฏิบัติการบูรณาการภาครัฐและเอกชนในการจัดยุทธศาสตร์เศรษฐกิจภาคตะวันออก This template can be used as a starter file to give updates for.
ระเบียบวิธีวิจัยพื้นฐานทางธุรกิจ
การวิเคราะห์โจทย์ปัญหา (Problem Analysis)
การวิเคราะห์และออกแบบขั้นตอนวิธี
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 12: เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Dynamic.
สารสนเทศศาสตร์เบื้องต้น
ใบสำเนางานนำเสนอ:

RECURSION Lecture 6 CS2110 – Fall 2013

Overview references to sections in text 2  What is recursion? slide 1-7  Base case slide 13  How Java stack frames work slide 28-32

Recursion 3  Arises in three forms in computer science  Recursion as a mathematical tool for defining a function in terms of its own value in a simpler case  Recursion as a programming tool. You’ve seen this previously but we’ll take it to mind-bending extremes (by the end of the class it will seem easy!)  Recursion used to prove properties about algorithms. We use the term induction for this and will discuss it later.

Pictorial examples 4 Droste effect Sierpinksi triangle Some examples of recursion (inside and outside CS): Garfield dreaming recursively. Recursive tree Recursion เป็นกระบวนการรูปแบบซ้ำ ๆ โดยที่มีรูปแบบ เหมือนเดิมแต่มีขนาดเล็กลง [CS1020 Lecture 10: Recursion]

Textual examples 5 Definitions based on recursion: Recursive definitions: 1.A person is a descendant of another if  the former is the latter’s child, or  the former is one of the descendants of the latter’s child. 2.A list of numbers is  a number, or  a number followed by a list of numbers. Recursive acronyms: 1.GNU = GNU’s Not Unix 2.PHP = PHP: Hypertext Preprocessor [CS1020 Lecture 10: Recursion]

Recursion as a math technique 6  Broadly, recursion is a powerful technique for specifying functions, sets, and programs  A few recursively-defined functions and programs  factorial  combinations  exponentiation (raising to an integer power)  Some recursively-defined sets  grammars  expressions  data structures (lists, trees,...)

Example: Sum the digits in a number 7  E.g. sum(7) = 7; sum(87012) = 2 + sum(8701); sum(87012) = 2+(1+(0+(7+8))) = 18 /** return sum of digits in n, given n >= 0 */ public static int sum(int n) { if (n < 10) return n; // { n has at least two digits } // return first digit + sum of rest return n%10 + sum(n/10); } sum calls itself!

Example: Is a string a palindrome? 8  isPal(“racecar”) = true  isPal(“pumpkin”) = false /** = "s is a palindrome" */ public static boolean isPal(String s) { if (s.length() <= 1) return true; // { s has at least 2 chars } int n= s.length()-1; return s.charAt(0) == s.charAt(n) && isPal(s.substring(1, n)); } racecar aceca cec e Substring from s[1] to s[n-1]

Count the e’s in a string 9  countEm(‘e’, “it is easy to see that this has many e’s”) = 4  countEm(‘e’, “Mississippi”) = 0 /** = “number of times c occurs in s */ public static int countEm(char c, String s) { if (s.length() == 0) return 0; // { s has at least 1 character } if (s.charAt(0) != c) return countEm(c, s.substring(1)); // { first character of s is c} return 1 + countEm (c, s.substring(1)); } Substring s[1..], i.e. s[1], …, s(s.length()-1)

The Factorial Function (n!) 10  Define n! = n·(n  1)·(n  2)···3·2·1 read: “n factorial” E.g. 3! = 3·2·1 = 6  Looking at definition, can see that n! = n * (n-1)!  By convention, 0! = 1  The function int  int that gives n! on input n is called the factorial function

The Factorial Function (n!) 11  n! is the number of permutations of n distinct objects  There is just one permutation of one object. 1! = 1  There are two permutations of two objects: 2! =  There are six permutations of three objects: 3! =  If n > 0, n! = n·(n  1)!

Recursion in CS1010: Factorial (2/2) 12 fact(n): if (n == 0) return 1; else return n * fact(n-1); fact(5) fact(4) 5* fact(3) 4* fact(2) 3* fact(1) 2* fact(0) 1* Tracing recursion [CS1020 Lecture 10: Recursion]

General Approach to Writing Recursive Methods หา parameter n ที่เราสามารถหาคำตอบของ n ด้วยการรวมคำตอบของปัญหาเดิมที่มีค่า n ที่ เล็กกว่า เช่น n! = n * (n-1)! นั่นคือ หาคำตอบ ของปัญหาใหญ่ จาก คำตอบของปัญหาที่ง่าย กว่า 2. หากรณีพื้นฐาน base case(s) – ค่าน้อยที่สุดของ n ที่เรารู้คำตอบแน่ ๆ (e.g. 0! = 1) นั่นคือ หาคำตอบในปัญหาที่ง่ายที่สุด ที่ใคร ๆ ก็ รู้ไม่ต้องคำนวณ 3. ตรวจสอบ method โดยใช้ค่า n ใด ๆ ดูว่า code จะถึงกรณีพื้นฐานหรือไม่

A cautionary note 14  จำไว้ว่า เมื่อ method เรียกตัวเอง method ที่ถูกเรียก จะมีตัวแปรเป็นของตัวเอง  จำไว้ว่า method ที่ค่า n สูงกว่า จะรอ method ที่มีค่า n น้อยกว่า return เสมอ  อย่าเปลี่ยนค่า ตัวแปร global ใน recursive method  แม้ว่าจะ compile ผ่าน แต่ มันจะมี error เยอะ  มันยาก

The Fibonacci Function 15  Mathematical definition: fib(0) = 0 fib(1) = 1 fib(n) = fib(n  1) + fib(n  2), n ≥ 2  Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, … /** = fibonacci(n), for n >= 0 */ static int fib(int n) { if (n <= 1) return n; // { 1 < n } return fib(n-2) + fib(n-1); } two base cases! Fibonacci (Leonardo Pisano) 1170  1240? Statue in Pisa, Italy Giovanni Paganucci 1863

Recursive Execution 16 fib(4) fib(2) fib(0) fib(1) Execution of fib(4): fib(3) fib(0) fib(1) fib(2) /** = fibonacci(n), for n >= 0 */ static int fib(int n) { if (n <= 1) return n; // { 1 < n } return fib(n-2) + fib(n-1); }

Tracing recursive Fibonacci 17 Tracing recursive Fibonacci: Note the many duplicated fib()’s! The same computations are done over and over again! fib(4) fib(3) fib(2) fib(1) fib(2)fib(1) fib(2)fib(1) fib(3) fib(2) fib(6) fib(5) fib(4) Three duplicate calls to fib(3)! [CS1020 Lecture 10: Recursion]

ข้อสังเกต 18  วิธีคำนวณ Fibonacci elegant but inefficient  It “recomputes” answers again and again!  To improve speed, need to save known answers in a table!  One entry per answer  Such a table is called a cache fib(4) fib(2) fib(0) fib(1) fib(3) fib(0) fib(1) fib(2)

Memoization (fancy term for “caching”) 19  Memoization เป็นเทคนิคช่วยให้ โปรแกรมคำนวณไวขึ้น โดยพยายาม ไม่ให้เรียกคำนวณแก้ปัญหาเดิม ๆ ซ้ำ ๆ ที่เคยทำไปแล้ว  นั่นคือ พอคำนวณคำตอบได้เสร็จ, เรา ต้อง save ผลลัพธ์ไว้  ครั้งต่อไป ที่เราอยากได้คำตอบของ ปัญหาเดิม, เราก็แค่ไปดูที่เรา save ไว้

Adding Memoization to our solution  Before memoization: 20 static int fib(int n) { if (n <= 1) return n; else return fib(n-2) + fib(n-1); } /** For 0 <= k < cached.size(), cached[k] = fib(k) */ static ArrayList cached= new ArrayList (); The list used to memoize

/** For 0 <= k < cached.size(), cached[k] = fib(k) */ static ArrayList cached= new ArrayList (); static int fib(int n) { if (n < cached.size()) return cached.get(n); int v; if (n <= 1) v= n; else v= fib(n-2) + fib(n-1); if (n == cached.size()) cached.add(v); return v; } After Memoization This works because of definition of cached 21 This appends v to cached, keeping cached’s definition true

Notice the development process 22  We started with the idea of recursion  Created a very simple recursive procedure  Noticed it will be slow, because it wastefully recomputes the same thing again and again  So made it a bit more complex but gained a lot of speed in doing so  This is a common software engineering pattern

Why did it work? 23  This cached list “works” because for each value of n, either cached.get(n) is still undefined, or has fib(n)  Takes advantage of the fact that an ArrayList adds elements at the end, and indexes from size=5 cached.get(0) = 0 cached.get(1) = 1 … cached.get(n) = fib(n) Property of our code: cached.get(n) accessed after fib(n) computed

Iterative Fibonacci 24 int fib(int n) { if (n <= 2) return 1; else { int prev1=1, prev2=1, curr; for (int i=3; i<=n; i++) { curr = prev1 + prev2; prev2 = prev1; prev1 = curr; } return curr; }  Q: Which part of the code is the key to the improved efficiency? (1) Part A (red) (2) Part B (blue) [CS1020 Lecture 10: Recursion]

Non-Negative Integer Powers 25  a n = a·a·a···a (n times)  Alternative description:  a 0 = 1  a n+1 = a·a n /** = a n, given n >= 0 */ static int power(int a, int n) { if (n == 0) return 1; else return a*power(a,n-1); }

A Smarter Version 26  Power computation:  a 0 = 1  If n is nonzero and even, a n = (a*a) n/2  If n is nonzero, a n = a * a n-1 Java note: For ints x and y, “x/y” is the integer part of the quotient  We’ll see that judicious use of the second property makes this a logarithmic algorithm, as we will see Example: 3 8 = (3*3) * (3*3) * (3*3) * (3*3) = (3*3) 4

Smarter Version in Java 27  n = 0: a 0 = 1  n nonzero and even: a n = (a*a) n/2  n nonzero: a n = a·a n-1 /** = a**n, for n >= 0 */ static int power(int a, int n) { if (n == 0) return 1; if (n%2 == 0) return power(a*a, n/2); return a * power(a, n-1); }

Build table of multiplications 28 nnmults … Start with n = 0, then n = 1, etc., for each, calculate number of mults based on method body and recursion. See from the table: For n a power of 2, n = 2 k, only k+1 = (log n) + 1 mults static int power(int a, int n) { if (n == 0) return 1; if (n%2 == 0) return power(a*a, n/2); return a * power(a, n-1); } For n = 2 15 = 32768, only 16 mults!

Java “compiles” recursive code อย่างไร ? 29  Key idea:  Java ใช้ stack เพื่อจำ parameters และตัวแปรท้องถิ่น ของแต่ละ method calls  แต่ละการเรียก method จะได้รับ stack frame ของตัวเอง  stack frame จะเก็บ  ตัวแปรท้องถิ่นของ method  Parameters ของ method  ค่าที่ method return, ที่อยู่การ return

return info local variables parameters Stack Frame 30  stack frame ใหม่ถูก pushed เมื่อมี การเรียก method  stack frame ถูก popped เมื่อ method returns  โดยที่ค่าการ return จะอยู่ ที่ top ของ stack a stack frame retval a, n

Example: power(2, 5) 31 return info (a = ) 2 (n = ) 5 (hP = ) ? return info (a = ) 2 (n = ) 5 (hP = ) ? return info (a = ) 2 (n = ) 2 (hP = ) ? return info (a = ) 2 (n = ) 5 (hP = ) ? return info (a = ) 2 (n = ) 2 (hP = ) ? return info (a = ) 2 (n = ) 1 (hP = ) ? return info (a = ) 2 (n = ) 5 (hP = ) 4 return info (a = ) 2 (n = ) 5 (hP = ) ? return info (a = ) 2 (n = ) 2 (hP = ) 2 return info (a = ) 2 (n = ) 5 (hP = ) ? return info (a = ) 2 (n = ) 2 (hP = ) ? return info (a = ) 2 (n = ) 1 (hP = ) 1 (retval = ) 1 (retval = ) 2 (retval = ) 4 (retval = ) 32 hP: short for halfPower

How Do We Keep Track? 32  อาจจะมีหลาย frame ใน stack, แต่การคำนวณจะทำ เฉพาะข้อมูลที่อยู่บน top ของ stack เท่านั้น  frame ด้านล่างจะรอผลการ return จาก frame ด้านบน

public static void printLL(Node n) { if (n != null) { System.out.print(n.item); printLL(n.next); } Printing a Linked List recursively 33 printLL head Output: 589 printLL (head)  Q: How about printing in reverse order? Q: What is the base case? Example 3 [CS1020 Lecture 10: Recursion]

public static void printLL (Node n) { if (n!=null) { System.out.print(n.value); printLL (n.next); } 3.4 Printing a Linked List recursively in reverse order 34 printRev head Output: 58 Just change the name! … Sure, right! printRev(head)  9 printRev printRev(n.next); System.out.print(n.value); Example 4 [CS1020 Lecture 10: Recursion]

Sorted Linked List Insertion (1/2) 35 insert(p,v) p == null v < p.element v >= p.element v p.next p.element v Case 1: Tail insertion Case 2: Insert before p Case 3: Insert after p (recursion) p.element insert ( p.next,v) Insert an item v into the sorted linked list with head p Example 5 [CS1020 Lecture 10: Recursion]

Sorted Linked List Insertion (2/2) 36 public static Node insert(Node p, int v) { // Find the first node whose value is bigger than v // and insert before it. // p is the “head” of the current recursion. // Returns the “head” after the current recursion. if (p == null || v < p.item) return new Node(v, p); else { p.next = insert(p.next, v); return p; } To call this method: head = insert(head, newItem); Example 5 [CS1020 Lecture 10: Recursion]

Conclusion 37  Recursion is a convenient and powerful way to define functions  Problems that seem insurmountable can often be solved in a “divide-and-conquer” fashion:  Reduce a big problem to smaller problems of the same kind, solve the smaller problems  Recombine the solutions to smaller problems to form solution for big problem

Extra slides 38  For use if we have time for one more example of recursion  This builds on the ideas in the Fibonacci example

Combinations (a.k.a. Binomial Coefficients) 39  How many ways can you choose r items from a set of n distinct elements? ( ) “n choose r” ( ) = number of 2-element subsets of {A,B,C,D,E} 2-element subsets containing A: {A,B}, {A,C}, {A,D}, {A,E} 2-element subsets not containing A: {B,C},{B,D},{B,E},{C,D},{C,E},{D,E}  Therefore, = +  … in perfect form to write a recursive function! ( ) nrnr 5252

Combinations 40 = +, n > r > 0 = 1 ( ) nrnr n1rn1r n1r1n1r1 nnnn n0n = Pascal’s triangle Can also show that = ( ) nrnr n! r!(n  r)!

Binomial Coefficients 41 (x + y) n = x n + x n  1 y + x n  2 y 2 + ··· + y n =  x n  i y i ( ) nini nnnn n0n0 n1n1 n2n2 n i = 0 Combinations are also called binomial coefficients because they appear as coefficients in the expansion of the binomial power (x+y) n :

Combinations Have Two Base Cases 42  Coming up with right base cases can be tricky!  General idea:  Determine argument values for which recursive case does not apply  Introduce a base case for each one of these Two base cases = +, n > r > 0 = 1 ( ) nrnr n1rn1r n1r1n1r1 nnnn n0n0

Recursive Program for Combinations 43 /** = no. combinations of n things taking r at a time. Precondition: 0 <= r <= n */ static int combs(int n, int r) { if (r == 0 || r == n) return 1; //base cases else return combs(n-1,r) + combs(n-1,r-1); } = +, n > r > 0 = 1 ( ) nrnr n1rn1r n1r1n1r1 nnnn n0n0

Exercise for the reader (you!) 44  Modify our recursive program so that it caches results  Same idea as for our caching version of the fibonacci series  Question to ponder: When is it worthwhile to adding caching to a recursive function?  Certainly not always…  Must think about tradeoffs: space to maintain the cached results vs speedup obtained by having them

Something to think about 45  With fib(), it was kind of a trick to arrange that: cached[n] = fib(n)  Caching combinatorial values will force you to store more than just the answer:  Create a class called Triple  Design it to have integer fields n, r, v  Store Triple objects into ArrayList cached ;  Search cached for a saved value matching n and r Hint: use a foreach loop