/
Recursion II Fundamentals  of Computer  Science  Outline Recursion Recursion II Fundamentals  of Computer  Science  Outline Recursion

Recursion II Fundamentals of Computer Science Outline Recursion - PowerPoint Presentation

luanne-stotts
luanne-stotts . @luanne-stotts
Follow
344 views
Uploaded On 2019-11-02

Recursion II Fundamentals of Computer Science Outline Recursion - PPT Presentation

Recursion II Fundamentals of Computer Science Outline Recursion A method calling itself A new way of thinking about a problem A powerful programming paradigm Examples Last time Factorial binary search Htree Fibonacci ID: 762321

public mystery pop push mystery public push pop void static examples pile recursion call return class stack walkthrough args

Share:

Link:

Embed:

Download Presentation from below link

Download Presentation The PPT/PDF document "Recursion II Fundamentals of Computer ..." is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.


Presentation Transcript

Recursion II Fundamentals of Computer Science

Outline RecursionA method calling itselfA new way of thinking about a problemA powerful programming paradigm Examples: Last time: Factorial, binary search, H-tree, FibonacciToday:Greatest Common Divisor (GCD)Brownian MotionSorting

Recursion Walkthrough Call Stack n public class RecursiveMystery { public static void mystery( int n) { System. out.println (n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples

Recursion Walkthrough Call Stack n 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println (n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples

Recursion Walkthrough Call Stack n 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3

Recursion Walkthrough Call Stack n 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println(n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3 ); //Push } //Pop} examples 3 2

Recursion Walkthrough Call Stack n 0 mystery(1-1) 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println (n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args ) { mystery(3); //Push } //Pop } examples 3 2 1

Recursion Walkthrough Call Stack n 0 mystery(1-1) 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0

Recursion Walkthrough Call Stack n 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println (n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args ) { mystery(3 ); //Push } //Pop } examples 3 2 1 0

Recursion Walkthrough Call Stack n -1 mystery(1-2) 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0

Recursion Walkthrough Call Stack n -1 mystery(1-2) 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println (n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args ) { mystery(3); //Push } //Pop } examples 3 2 1 0

Recursion Walkthrough Call Stack n 1 mystery(2-1) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System.out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3 ); //Push } //Pop} examples 3 2 1 0 -1

Recursion Walkthrough Call Stack n 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args ) { mystery(3 ); //Push } //Pop} examples 3 2 1 0 -1

Recursion Walkthrough Call Stack n 0 mystery(2-2) 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1

Recursion Walkthrough Call Stack n 2 mystery(3-1) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0

Recursion Walkthrough Call Stack n 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println (n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop } examples 32 1 0 -1 0

Recursion Walkthrough Call Stack n 1 mystery(3-2) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args ) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0

Recursion Walkthrough Call Stack n 0 mystery(1-1) 1 mystery(3-2) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0 1

Recursion Walkthrough Call Stack n 1 mystery(3-2) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0 1 0

Recursion Walkthrough Call Stack n -1 mystery(1-2) 1 mystery(3-2) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0 1 0

Recursion Walkthrough Call Stack n 1 mystery(3-2) 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println(n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0 1 0 -1

Recursion Walkthrough Call Stack n 3 mystery(3) public class RecursiveMystery { public static void mystery( int n) { System. out.println (n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop} examples 3 2 1 0 -1 0 1 0 -1

Recursion Walkthrough Call Stack n public class RecursiveMystery { public static void mystery( int n) { System. out.println (n); if (n <= 0) return; //Pop mystery(n - 1 ); //Push mystery(n - 2); //Push } //Pop public static void main(String[] args) { mystery(3); //Push } //Pop } examples 3 2 1 0 -1 0 1 0 -1

Brownian Motion Models many natural and artificial phenomenonMotion of pollen grains in waterPrice of stocks Rugged shapes of mountains and clouds 24 examples

Simulating Brownian Motion Midpoint displacement method: Track interval (x 0 , y 0) to (x1, y 1)Choose d displacement randomly from Gaussian Divide in half, xm= (x0+x1 )/2 and ym = (y0+y 1)/2 + dRecur on the left and right intervals 25 examples

Recursive Midpoint Displacement A lgorithm 26 void curve ( double x0, double y0, double x1, double y1, double var) { if (x1 - x0 < .005) { StdDraw.line(x0, y0, x1, y1); return; } double xm = (x0 + x1) / 2.0; double ym = (y0 + y1) / 2.0; ym = ym + StdRandom. gaussian(0, Math.sqrt( var)); curve(x0, y0, xm, ym, var / 2.0); curve(xm , ym, x1, y1, var / 2.0);} reduction step base case

Plasma Cloud Same idea, but in 2D Each corner of square has some color value Divide into four sub-squaresNew corners: avg of original corners, or all 4 + random Recur on four sub-squares 27 examples

28

29 Brownian Landscape

Divide and Conquer Divide and conquer paradigmBreak big problem into small sub-problemsSolve sub-problems recursivelyCombine results Used to solve many important problems S orting things, mergesort: O(N log N)Parsing programming languagesDiscrete FFT, signal processingMultiplying large numbersTraversing multiply linked structures (stay tuned) 30 “ Divide et impera. Vendi , vidi, vici.” -Julius Caesar examples

Divide and Conquer: Sorting Goal: Sort by number, ignore suit, aces high 31 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Unsorted pile #1 Unsorted pile #2 examples

32 ApproachSplit in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 Merging Take card from whichever pile has lowest card examples

33 ApproachSplit in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

34 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

35 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

36 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

37 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

38 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

39 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

40 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 examples

41 Approach Split in half (or as close as possible) Give each half to somebody to sort Take two halves and merge together Sorted pile #1 Sorted pile #2 How many operations to do the merge? Linear in the number of cards, O(N) But how did pile 1 and 2 get sorted? Recursively of course! Split each pile into two halves, give to different people to sort. examples

42 How many split levels ? O (log 2 N) How many merge levels? O(log 2 N) Operations per level? O(N) Total operations? O( N log 2 N) examples

Summary RecursionA method calling itself:Sometimes just once, e.g. binary searchSometimes twice, e.g. mergesortSometimes multiple times, e.g. H-tree All good recursion must come to an end: Base case that does NOT call itself recursively A powerful tool in computer science:Allows elegant and easy to understand algorithms(Once you get your head around it)