รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room. - ppt ดาวน์โหลด
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room.
งานนำเสนอเรื่อง: "รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room."— ใบสำเนางานนำเสนอ:
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room no. 913 Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 2 Recursion 1.What is recursion? 2.Why recursion ? When would I use recursion?
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 3 Solving Algorithm Problem : Eat your Meal There are 2 ways to look at the problem. 1.Iteration : Repeat 1 bite until done. 2.Recursion.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 4 Recursion EatMeal (big) : EatMeal (smaller) +........ EatMeal (bite n) : EatMeal (n-1) + eat 1 bite. /or eat 1 bite + EatMeal (n-1). EatMeal (big) : EatMeal (smaller) +........ EatMeal (bite n) : EatMeal (n-1) + eat 1 bite. /or eat 1 bite + EatMeal (n-1). Problem : Eat your Meal Recursion : by breaking down a problem into a smaller versions of itself and then be able to build up to a solution to the entire problem. Recursion is the process of defining a problem (or the solution to a problem) in terms of (a simpler version of) itself.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 5 EatMeal (5) : EatMeal (4) + eat 1 bite. Base Case & Backtracking EatMeal (6) : EatMeal (5) + eat 1 bite. EatMeal (4) : EatMeal (3) + eat 1 bite. Recursively call
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 6 EatMeal (2) : EatMeal (1) + eat 1 bite. Base Case & Backtracking EatMeal (3) : EatMeal (2) + eat 1 bite. EatMeal (1) : eat 1 bite. Recursively call Keep calling recursion ==> infinite loop. Must stop somewhere ! ==> base case no recursively call Keep calling recursion ==> infinite loop. Must stop somewhere ! ==> base case no recursively call Base case (no recursively call) Backtracking to the previous stop Backtracking
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 7 EatMeal (5) : EatMeal (4) + eat 1 bite. Base Case & Backtracking EatMeal (6) : EatMeal (5) + eat 1 bite. EatMeal (4) : EatMeal (3) + eat 1 bite. Recursively call Done ! Backtracking
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 8 0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 4! = 4 * 3 * 2 * 1 5! = 5 * 4 * 3 * 2 * 1 n! = n*(n-1)*(n-2) *...*1 int fac (int n) //n>=0 { int result = 1; for (int i=n; i>=1; i--) result *= i; return result ; } Factorial Iteration Iterative : Repeat times i to the result. 4! =4*3*2*1
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 9 n! = 1 if n=0, n=1 //base case n! = n*(n-1) ! if n>1//recursive case n! = 1 if n=0, n=1 //base case n! = n*(n-1) ! if n>1//recursive case Factorial Recursion 4! = 4 * 3 * 2 * 1 3! = 3 * 2 * 1 2! = 2 * 1 1! = 1 0! = 1 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 0! = 1 Recursion is the process of defining a problem in terms of (a simpler version of) itself. int fac (int n) { //n>=0 if (n<=1) return 1; else return n * fac(n-1); }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 10 Fibonaci Sequence Iterative 0112358 f0f1f2f3f4f5f6f7... 13 lo hi new 21 int fib(int n) { // iterative, n>=0 int lo = 0;int hi = 1;int new; if (n==1 || n==0) return n; for( int i = 2; i<=n; i++){ new = hi + lo; lo = hi; hi = new; } return new; } lo hi new
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 11 fib(n) = //base case fib(n) = //recursive case fib(n) = //base case fib(n) = //recursive case Fibonaci Sequence Recursive 0112358 f0f1f2f3f4f5f6f7... f7 = ? f7 = f6 + f5 fib(n-1) + fib(n-2) if n>1 n if n=0, n=1 int fib (int n) { // recursive, n>=0 if (n<=1) return n; else return fib(n-1) + fib(n-2); }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 12 Binary Search Recursive 134517183133 01234567 low1high1 if (low>high) return(-1); //simple case mid = (low+high)/2; if (x==a[mid]) return(mid); //simple case else if (a[mid] < x) return search (mid+1,high,x) //recursive case else return search (low,mid-1,x) //recursive case search for x = 17.5 L2H2 M2 L3,H3,M3 L4 H4 ret_value search (low, high,x) mid1<17.5 17.5<
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 13 Recursive Algorithms Recursive algorithms 1.Always have a parameter 2.Recursive call always involves a modified version of the parameter 3.Always have a conditional on the parameter to stop the recursion Recursive algorithms 1.Always have a parameter 2.Recursive call always involves a modified version of the parameter 3.Always have a conditional on the parameter to stop the recursion
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 14 Stack of Recursion int fac (int n) //n>=0 { if (n <= 1) //base case return 1; else } //------------------------------- int main(){ int i = fac(4); return n * fac(n-1); { int x; x = fac(n-1); //recursive return n * x; } { int x; x = fac(n-1); //recursive return n * x; } fac(4) fac(3) 4 - 3 - fac(2) 2 - fac(1) 1 1 1 2*1 = 2 2 3*2 = 6 6 4*6 = 24 Backtracking return to the previous call Backtracking return to the previous call stackstack stackstack n x main() i - 24 To clearly see the process, we change the code to have x to recieve the returning value of fac( ).
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 15 Iteration VS Recursion int facI (int n) //n>=0 { int result = 1; for (int i=n; i>=1; i--) result *= i; return result ; } int facR (int n) { //n>=0 if (n<=1) return 1; else return n * facR(n-1); } Space ? RunTime ?
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 16 Tail Recursion Tail recursion is very easy to write in iteration. Iteration is usually more efficient. Tail Recursion execute recursion as the last one. Recursion suffers from function call overhead. -Passing parameters. -Pushing /Poping stack. So, Why bother recursion? int fac (int n) { if (n<=1) return 1; else return n * fac(n-1); } int fac (int n) { if (n<=1) return 1; else return n * fac(n-1); } int fib (int n) { if (n<=1) return n; else return fib(n-1) + fib(n-2); } int fib (int n) { if (n<=1) return n; else return fib(n-1) + fib(n-2); } int search(int low, int high, int x) { if (low>high) return(-1); //simple case mid = (low+high)/2; if (x==a[mid]) return(mid); //simple case else if (a[mid] < x) return search (mid+1,high,x) //recur else return search (low,mid-1,x) //recur } int search(int low, int high, int x) { if (low>high) return(-1); //simple case mid = (low+high)/2; if (x==a[mid]) return(mid); //simple case else if (a[mid] < x) return search (mid+1,high,x) //recur else return search (low,mid-1,x) //recur }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 17 When would I use recursion? Recursion makes the most sense whenever you need iterative branching. Recursive call Base case The Sierpinski triangle ( เชอเรอปีน สกี ), 3 time recursively calls with different parameters, the tower of Hanoi, 2 time recursively calls. The Sierpinski triangle ( เชอเรอปีน สกี ), 3 time recursively calls with different parameters, the tower of Hanoi, 2 time recursively calls. The n-queen problem has iterative branching and uses the call stack advantage when backtracking to remember the previous conditions.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 18 A B C Tower of Hanoi 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 ต้องการหยิบแผ่นดิกส์ทั้งหมดจากเสา A ไปเสา C โดยใช้เสา B ช่วย หยิบทีละแผ่น ต้องหยิบแผ่นที่อยู่ด้านบนก่อน แผ่นใหญ่ห้ามวางทับแผ่นเล็ก ต้องการหยิบแผ่นดิกส์ทั้งหมดจากเสา A ไปเสา C โดยใช้เสา B ช่วย หยิบทีละแผ่น ต้องหยิบแผ่นที่อยู่ด้านบนก่อน แผ่นใหญ่ห้ามวางทับแผ่นเล็ก A B C
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 19 A B C Tower of Hanoi 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 What are you doing ? move 3 disks (A->B) What is the problem? move 4 disks (A->C ) move 3 disks (B->C) move disk #4 from A to C Is this recursion. How ?
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 20 A B C Tower of Hanoi What is a Problem ? What is a Subproblem ? _____ ( big ) : ____ (smaller ) +... move 43 nn-1 Oh! If I move #4 to C, that’s done! Why 4 ? Change to general case ! Why 4 ? Change to general case ! 4 4 3 3 2 2 1 1
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 21 Tower of Hanoi _____ ( n ) : ____ (n -1 ) move from, to, aux, A, C, B,A, B,C printf(“move disk n from %c to %c”, A,C); move( n-1, B, C, A); } What is a base case ? When do we stop moving? if (n==1) printf(“move disk n from %c to %c”, A,C); else { if (n==1) printf(“move disk n from %c to %c”, A,C); else { A B C 4 4 3 3 2 2 1 1
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 22 void move(int n, char A, char C, char B) { if (n == 1) cout << n << “from” << A << “to” << C; else { move(n-1, A, B, C); cout << n << “from” << A << “to” << C; move(n-1, B, C, A); } } A B C Tower of Hanoi 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1 4 4 2 2 3 3 1 1
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 23 Recursion VS Iteration 1.Iteration is usually more efficient in space and runtime since recursion suffers from function call overhead ( passing parameters, pushing-poping stack). 2.Coding iterative branching, recursion uses less coding time, more readable & understandable and easier for debugging. 1.Iteration is usually more efficient in space and runtime since recursion suffers from function call overhead ( passing parameters, pushing-poping stack). 2.Coding iterative branching, recursion uses less coding time, more readable & understandable and easier for debugging.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 24 Sierpinski Triangle The Sierpinski Triangle, also called Sierpinski Gasket and Sierpinski Sieve, is named after Waclaw Sierpinski, a Polish mathematician (1882-1969).
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 25 Sierpinski Triangle The Sierpinski Triangle can be drawn by hand as follows: 1.Start with a single triangle. This is the only triangle in this direction, all the others will be upside down. 2.Inside this triangle, draw a smaller upside down triangle. It's corners should be exactly in the centers of the sides of the large triangle. 3.Now, draw 3 smaller triangles in each of the 3 triangles that are pointing upwards, again with the corners in the centers of the sides of the triangles that point upwards. 4.Now there are 9 triangles pointing upwards. In each of these 9, draw again smaller upside down triangles. 5.In the 27 triangles pointing upwards, again draw 27 triangles pointing downwards. 6.After infinite steps, and if all triangles pointing upwards would be filled, you have the Sierpinski Sieve. http://lodev.org/cgtutor/sierpinski.html Every step, more triangles have to be drawn. This is a recursive process.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 26 Sierpinski Triangle Algorithm Splits a triangle into 4 smaller triangles, and then calls itself for 3 of the 4 smaller triangles. Splits a triangle into 4 smaller triangles, and then calls itself for 3 of the 4 smaller triangles. Sierpinski (triangle) 1.Find the mid point of each side of the triangle 2.Draw lines connecting the midpoints, which will form 4 smaller triangles called A, B, C and D, where D in the center. 3.Color in (or cut out) the center triangle D. 4.Do Sierpinski (triangle A) 5.Do Sierpinski (triangle B) 6.Do Sierpinski (triangle C) Sierpinski (triangle) 1.Find the mid point of each side of the triangle 2.Draw lines connecting the midpoints, which will form 4 smaller triangles called A, B, C and D, where D in the center. 3.Color in (or cut out) the center triangle D. 4.Do Sierpinski (triangle A) 5.Do Sierpinski (triangle B) 6.Do Sierpinski (triangle C)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 27 The N Queen Problem Placing N chess queens on an N×N chessboard so that no two queens attack each other. Q Q Q Q Solution for 4 Queen problem.The expected output.. 1..... 1 1..... 1. Q Q Q Q Q Q Q Q Solution for 8 Queen problem. 8 x 8 board has 92 distinct solutions. 12 unique solutions (reduce redundency of symmetry (rotations & reflections)). 8 x 8 board has 92 distinct solutions. 12 unique solutions (reduce redundency of symmetry (rotations & reflections)).
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 28 N Queen Naive Algorithm Naive Algorithm Generate all possible configurations of queens on board and print a configuration that satisfies the given constraints. ลองใส่ Queen ทุกแบบ ถ้าไม่กินกัน พิมพ์ผลลัพธ์ Naive Algorithm Generate all possible configurations of queens on board and print a configuration that satisfies the given constraints. ลองใส่ Queen ทุกแบบ ถ้าไม่กินกัน พิมพ์ผลลัพธ์ while (still untried configuration){ board = next configuration; if (noAttacking(board)) print (board); } while (still untried configuration){ board = next configuration; if (noAttacking(board)) print (board); }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 29 Data Structure for Queens – 2D array How can we keep queens? Q Q Q Q #define N 4 int board[N,N]; #define N 4 int board[N,N];. 1..... 1 1..... 1. 2D array.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 30 Recursive PutQueen Algorithm void PutQueenInRow (int r, int board[N][N]){ for (int c=0; c
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 31 3, 4 To put Q(r, c), no row check (place row by row) but must check 1. col(c) free? Check this col of the row above Q[r,c] 2. up(7) free? Check up diagonal right to Q[r,c] 3. down(6) free? Check down diagonal left to Q[r,c] c0c1c2c3c4c5c6c7 r0 u0 d0 r1 u1 d1 r2 u2 d2 r3 u3 Q (r,c ) d3 r4 u4 d4 r5 u5 d5 r6 u6 d6 r7 u7 d7 d14 u8 d13 u9 d12 u10 d11 u11 d10 u12 d9 u13 d8 u14 Detecting Crashes Queen can eat in 8 directions. while(r >= 0) if (board[--r][c]) return false; while(r >= 0) if (board[--r][c]) return false; while(r =0 ) if (board[--r][++c]) return false; while(r =0 ) if (board[--r][++c]) return false; while(c >= 0 && r >= 0) if (board[--r][--c]) return false; while(c >= 0 && r >= 0) if (board[--r][--c]) return false; Q Q Q bool isSafe(int board[N][N], int r, int c){ return true; } return true; }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 32 Other Data Structures & Safe Checking
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 33 c0c1c2c3c4c5c6c7 r0 u0d0 r1 u1d1 r2 u2d2 r3 u3 Q d3 r4 u4d4 r5 u5d5 r6 u6d6 r7 u7d7 d14 u8 d13 u9 d12 u10 d11 u11 d10 u12 d9 u13 d8 u14 3, 4 To put Q(r, c) must check 1.col(c) free? 4 2.up(7) free? up(r+c) up(3+4) 3.down(6) free? down(r-c+(n-1)) 3-4+7 4.Since we place row by row so we don’t need to check the row. Detecting Crashes Queen can eat in 8 directions.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 34 Detecting Crashes c0c1c2c3 u0d0 r1 Q d1 u2d2 u3d3 d6 u4 d5 u5 d4 u6 1, 3 To put Q(r, c) must check 1.col(3) free? 2.up(4) free? up(r+c) up(1+3) 3.down(1) free? down(r-c+(n-1)) 1-3+3
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 35 Data Structure for Save Checking 1.col free? How many col ? int colFree[N]; 2.up free? int upFree[(2*N)-1]; 3.down free? int downFree[(2*N)-1]; c0c1c2c3 u0d0 u1d1 u2d2 u3d3 d6 u4 d5 u5 d4 u6 colFree 1111 0123 upFree0 0123456 C uses int to represent boolean: 0 means false. Others means true. C uses int to represent boolean: 0 means false. Others means true. Initialize all slots to 1. Clean board all are free. Initialize all slots to 1. Clean board all are free. 0 Q downFree0 0123456
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 36 Data Structure for Queens – 1D array c3 r1 Q Q Q Q Q Before: We keep queens in 2D array. #define N 4 int board[N,N];. 1..... 1 1..... 1. We can use 1 dimentional array. int b [N]; b3 row0123
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 37 Initializations #define N 8 #define D 2*N //diagonals int numsol = 0; //number of solutions int main( ) { int b[N]; //board indice are row int colFree[N], upFree[D], downFree[D]; for (int i = 0 ; i < N ; i++ ) colFree[i]= 1; //true for (int i = 0 ; i < D ; i++ ) upFree[i]= downFree[i]= 1; //true PutQueenInRow(0,b,colFree,upFree,downFree); //put in row 0 //recursive printf("Total solutions = %d\n",numsol); return 0; } int b[N]; //board indice are row int colFree[N], upFree[D], downFree[D]; int numsol = 0; //number of solutions PutQueenInRow(0,b,colFree,upFree,downFree); //put in row 0 //recursive
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 38 Recursive PutQueen void PutQueenInRow (int r,int b[],int colFree[],int upFree[],int downFree[]) { for (int c=0; c
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 39 A B AB C E : expression T : term F : facter E = T + T | T T = F * F | F F = letter | (E) Is this Expression? : A * B + C F F F T E * +T Recursive Chain : Function that indirectly calls himself from the other function(s). Recursive Chain
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 40 A(formal parameters){ B(actual arguments); } B(formal parameters){ A(actual arguments); } A B B(formal parameters); //Forward Declaration Forward Declaration
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 41 int main(){ string s = "A+B*C"; if (expression(s)) cout<<<" EXP.\n"; else cout<<<" NOT EXP.\n"; return 0; } int main(){ string s = "A+B*C"; if (expression(s)) cout<<<" EXP.\n"; else cout<<<" NOT EXP.\n"; return 0; } bool expression(const string& s){ //E = T+T | T size_t npos = s.find("+"); size_t len = s.length(); if (npos =len) //notFoundPlus return(term(s)); //E = T else { //E = T+T string s1(s,0,npos); //s1 = s[0] to s[npos-1] string s2(s,npos+1,len-npos+1);//s2=s[npos+1] to end of s2 return(term(s1) && term(s2)); } bool expression(const string& s){ //E = T+T | T size_t npos = s.find("+"); size_t len = s.length(); if (npos =len) //notFoundPlus return(term(s)); //E = T else { //E = T+T string s1(s,0,npos); //s1 = s[0] to s[npos-1] string s2(s,npos+1,len-npos+1);//s2=s[npos+1] to end of s2 return(term(s1) && term(s2)); } } E = T + T | T T = F * F | F F = letter | (E) s1="12345" s1.length()= 5 s="ABCDE"; string s2(s,1,3); //s2 = "BCD" from s[1] 3 chars string s3(s,2,2); //s3 = "CD" from s[2] 2 chars C++
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 42 bool term(const string& s){ //T = F*F | F size_t npos = s.find("*"); size_t len = s.length(); if (npos =len){ //notFoundStar return(factor(s)); //T = F }else { //T = F*F string s1(s,0,npos); //s1 = s[0] to s[npos-1] string s2(s,npos+1,len-npos+1);//s2=s[npos+1] to end of s2 return(factor(s1) && factor(s2)); } bool term(const string& s){ //T = F*F | F size_t npos = s.find("*"); size_t len = s.length(); if (npos =len){ //notFoundStar return(factor(s)); //T = F }else { //T = F*F string s1(s,0,npos); //s1 = s[0] to s[npos-1] string s2(s,npos+1,len-npos+1);//s2=s[npos+1] to end of s2 return(factor(s1) && factor(s2)); } bool factor(const string& s){ //F = letter | (E) if (s.length()==1 && isletter(s[0])) return true; else { string ss(s,1,s.length()-2); return((s[0]>='(')&&(s[2]>=')')&& expression(ss)); } bool factor(const string& s){ //F = letter | (E) if (s.length()==1 && isletter(s[0])) return true; else { string ss(s,1,s.length()-2); return((s[0]>='(')&&(s[2]>=')')&& expression(ss)); } bool expression(const string& s); bool isletter(char c){ return (c>='a' && c<='z')||(c='A' && c<='Z'); } bool expression(const string& s); bool isletter(char c){ return (c>='a' && c<='z')||(c='A' && c<='Z'); } C++
ดาวน์โหลด ppt รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL 01076249 Data Structures & Algorithms : Recursion 1 Recursion Lecturers : Boontee Kruatrachue Room.
งานนำเสนอที่คล้ายกัน Linked List ( ต่อ ) Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.