Recursion Michael Ernst UW CSE 140 To seal: moisten flap, fold over, and seal.

Slides:



Advertisements
Similar presentations
Recursion Genome 559: Introduction to Statistical and Computational Genomics Elhanan Borenstein.
Advertisements

Types of Algorithms.
Recursion. Recursion is a powerful technique for thinking about a process It can be used to simulate a loop, or for many other kinds of applications In.
Sorting and selection – Part 2 Prof. Noah Snavely CS1114
CMPS1371 Introduction to Computing for Engineers SORTING.
Recursion Michael Ernst CSE 190p University of Washington To seal: moisten flap, fold over, and seal.
Recursion Introduction to Computing Science and Programming I.
Copyright © 2008 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Sixth Edition Chapter 14: Recursion by.
Elementary Number Theory and Methods of Proof. Basic Definitions An integer n is an even number if there exists an integer k such that n = 2k. An integer.
6/20/2015 5:05 AMNumerical Algorithms1 x x1x
Algorithms. Problems, Algorithms, Programs Problem - a well defined task. –Sort a list of numbers. –Find a particular item in a list. –Find a winning.
CS107 Introduction to Computer Science Lecture 5, 6 An Introduction to Algorithms: List variables.
Chapter 15 Recursive Algorithms. 2 Recursion Recursion is a programming technique in which a method can call itself to solve a problem A recursive definition.
Starting Out with C++: Early Objects 5/e © 2006 Pearson Education. All Rights Reserved Starting Out with C++: Early Objects 5 th Edition Chapter 14 Recursion.
Section Section Summary Recursive Algorithms Proving Recursive Algorithms Correct Recursion and Iteration (not yet included in overheads) Merge.
CS 206 Introduction to Computer Science II 10 / 08 / 2008 Instructor: Michael Eckmann.
Sorting (Part II: Divide and Conquer) CSE 373 Data Structures Lecture 14.
CSE 311 Foundations of Computing I Lecture 12 Primes, GCD, Modular Inverse Spring
Algorithms. Problems, Algorithms, Programs Problem - a well defined task. –Sort a list of numbers. –Find a particular item in a list. –Find a winning.
(c) , University of Washington
Algorithms Friday 7th Week. Algorithms What is an Algorithm? –A series of precise steps, known to stop eventually, to solve a problem –NOT necessarily.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Recursion Review.
Copyright © 2014, 2008 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Eighth Edition by Tony Gaddis,
Chapter 14: Recursion Starting Out with C++ Early Objects
Recursion, Complexity, and Searching and Sorting By Andrew Zeng.
Chapter 3 (Part 3): Mathematical Reasoning, Induction & Recursion  Recursive Algorithms (3.5)  Program Correctness (3.6)
© by Kenneth H. Rosen, Discrete Mathematics & its Applications, Sixth Edition, Mc Graw-Hill, 2007 Chapter 4 (Part 3): Mathematical Reasoning, Induction.
Recursion, Complexity, and Sorting By Andrew Zeng.
Computer Science 101 Fast Searching and Sorting. Improving Efficiency We got a better best case by tweaking the selection sort and the bubble sort We.
CSE 311: Foundations of Computing Fall 2014 Lecture 12: Primes, GCD.
©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 15 * Recursive Algorithms.
More on Efficiency Issues. Greatest Common Divisor given two numbers n and m find their greatest common divisor possible approach –find the common primes.
Computer Science 101 A Survey of Computer Science QuickSort.
Computer Science 101 Fast Algorithms. What Is Really Fast? n O(log 2 n) O(n) O(n 2 )O(2 n )
Application: Algorithms Lecture 20 Section 3.8 Wed, Feb 21, 2007.
1 Recursive algorithms Recursive solution: solve a smaller version of the problem and combine the smaller solutions. Example: to find the largest element.
Recitation 8 Programming for Engineers in Python.
CSE 311: Foundations of Computing Fall 2013 Lecture 12: Primes, GCD, modular inverse.
23 February Recursion and Logarithms CSE 2011 Winter 2011.
Quicksort This is probably the most popular sorting algorithm. It was invented by the English Scientist C.A.R. Hoare It is popular because it works well.
Application: Algorithms Lecture 19 Section 3.8 Tue, Feb 20, 2007.
MA/CSSE 473 Day 07 Euclid's Algorithm. MA/CSSE 473 Day 07 Student Questions Review topics not covered in class Euclid's algorithm (if there is time) extended.
Chapter 1 Algorithms with Numbers. Bases and Logs How many digits does it take to represent the number N >= 0 in base 2? With k digits the largest number.
Chapter 4 With Question/Answer Animations 1. Chapter Summary Divisibility and Modular Arithmetic - Sec 4.1 – Lecture 16 Integer Representations and Algorithms.
Maitrayee Mukerji. Factorial For any positive integer n, its factorial is n! is: n! = 1 * 2 * 3 * 4* ….* (n-1) * n 0! = 1 1 ! = 1 2! = 1 * 2 = 2 5! =
CMPT 238 Data Structures More on Sorting: Merge Sort and Quicksort.
Algorithm Design Techniques, Greedy Method – Knapsack Problem, Job Sequencing, Divide and Conquer Method – Quick Sort, Finding Maximum and Minimum, Dynamic.
Algorithms.
Recursive Algorithms Section 5.4.
Chapter 4 (Part 3): Mathematical Reasoning, Induction & Recursion
Introduction to Computing Science and Programming I
Numerical Algorithms x x-1 Numerical Algorithms
Teach A level Computing: Algorithms and Data Structures
Algorithmic complexity: Speed of algorithms
Chapter 14: Recursion Starting Out with C++ Early Objects
Recursion "To understand recursion, one must first understand recursion." -Stephen Hawking.
Searching CSCE 121 J. Michael Moore.
Chapter 14: Recursion Starting Out with C++ Early Objects
Recursion UW CSE 160 Winter 2017
Recursion Spring 2015 UW CSE 160
Recursion UW CSE 160 Spring 2018
Discrete Math for CS CMPSC 360 LECTURE 12 Last time: Stable matching
Recursion Winter 2014 UW CSE 140
Divide and Conquer Algorithms Part I
Recursion UW CSE 160 Winter 2016
CS 1114: Sorting and selection (part two)
Application: Algorithms
Application: Algorithms
Sorting and selection Prof. Noah Snavely CS1114
Presentation transcript:

Recursion Michael Ernst UW CSE 140 To seal: moisten flap, fold over, and seal

Three recursive algorithms Sorting GCD (greatest common divisor) Exponentiation Used in cryptography, which protects information and communication

Sorting a list Python’s sorted function returns a sorted version of a list. sorted([3, 1, 4, 1, 5, 9])  [1, 1, 3, 4, 5, 9] How could you implement sorted ? Idea (“quicksort”, invented in 1960): – Choose an arbitrary element (the “pivot”) – Collect the smaller items and put them on its left – Collect the larger items and put them on its right Sir Anthony Hoare

First version of quicksort def quicksort(thelist): """Return a sorted version of thelist.""" pivot = thelist[0] smaller = [elt for elt in thelist if elt < pivot] larger = [elt for elt in thelist if elt > pivot] return smaller + [pivot] + larger print quicksort([3, 1, 4, 1, 5, 9])  [1, 1, 3, 4, 5, 9] There are three problems with this definition Write a test case for each problem

Problems with first version of quicksort 1.The “smaller” and “larger” lists aren’t sorted 2.Fails if the input list is empty 3.Duplicate elements equal to the pivot are lost

Near-final version of quicksort def quicksort(thelist): """Return a sorted version of thelist.""" if len(thelist) < 2: return thelist pivot = thelist[0] smaller = [elt for elt in thelist if elt < pivot] larger = [elt for elt in thelist if elt > pivot] return quicksort(smaller) + [pivot] + quicksort(larger) How can we fix the problem with duplicate elements?

2 ways to handle duplicate pivot items def quicksort(thelist): """Return a sorted version of thelist.""" if len(thelist) < 2: return thelist pivot = thelist[0] smaller = [elt for elt in thelist if elt < pivot] pivots = [elt for elt in thelist if elt == pivot] larger = [elt for elt in thelist if elt > pivot] return quicksort(smaller) + pivots + quicksort(larger) def quicksort(thelist): """Return a sorted version of thelist.""" if len(thelist) < 2: return thelist pivot = thelist[0] smaller = [elt for elt in thelist[1:] if elt <= pivot] larger = [elt for elt in thelist if elt > pivot] return quicksort(smaller) + [pivot] + quicksort(larger)

The form of a recursive algorithm Determine whether the problem is small or large If the problem is small: (“base case”) – Solve the whole thing If the problem is large: (“recursive case”) – Divide the problem, creating one or more smaller problems – Ask someone else to solve the smaller problems Recursive call to do most of the work – Do a small amount of postprocessing on the result(s) of the recursive call(s)

Recursion design philosophy Recursion expresses the essence of divide and conquer – Solve a smaller subproblem(s), then – Use the answer to solve the original problem Passing the buck: I am willing to do a small amount of work, as long as I can offload most of the work to someone else. Wishful thinking: If someone else solves most of the problem, then I will do the rest.

Decomposition for recursion List algorithms: Base case: short, or empty, list Recursive case: process – all but the first element of the list, or The smaller subproblem is only a tiny bit smaller The postprocessing combines the first element of the list with the recursive result – half of the list Often recursively process both halves The postprocessing combines the two recursive results Numeric algorithms: Base case: small number (often 1 or 0) Recursive case: process a smaller value – 1 less than the original value – half of the original value – … File system: Base case: single file Recursive case: process a subdirectory Geographical algorithms: Base case: small area Recursive case: smaller part of a map (or other spatial representation)

Recursion: base and inductive cases A recursive algorithm always has: – a base case (no recursive call) – an inductive or recursive case (has a recursive call) What happens if you leave out the base case? What happens if you leave out the inductive case?

GCD (greatest common divisor) gcd(a, b) = largest integer that divides both a and b gcd(4, 8) = 4 gcd(15, 25) = 5 gcd(16, 35) = 1 How can we compute GCD?

Euclid’s method for computing GCD (circa 300 BC, still commonly used!) a if b = 0 gcd(a, b) = gcd(b, a) if a < b gcd(a-b, b) otherwise

Python code for Euclid’s algorithm def gcd(a, b): """Return the greatest common divisor of a and b.""" if b == 0: return a if a < b: return gcd(b, a) return gcd(a-b, b)

Exponentiation Goal: Perform exponentiation, using only addition, subtraction, multiplication, and division. (Example: 3 4 ) def exp(base, exponent): """Return base exponent. Exponent is a non-negative integer.""" if exponent == 0: return 1 return base * exp(base, exponent - 1) Example: exp(3, 4) 3 * exp(3, 3) 3 * (3 * exp(3, 2)) 3 * (3 * (3 * exp(3, 1))) 3 * (3 * (3 * (3 * exp(3, 0)))) 3 * (3 * (3 * (3 * 1)))

Faster exponentiation Suppose the exponent is even. Then, base exponent = (base*base) exponent/2 Examples: 3 4 = = = = New implementation: def exp(base, exponent): """Return base exponent. Exponent is a non-negative integer.""" if exponent == 0: return 1 if exponent % 2 == 0: return exp(base*base, exponent/2) return base * exp(base, exponent - 1)

Comparing the two algorithms Original algorithm: 12 multiplications * * 5 * * 5 * 5 * 5 9 … 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 1 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 25 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 125 … Fast algorithm: 5 multiplications 5 12 (5 * 5) (25 * 25) * * 625 * * 625 * 625 * * 625 * 625 * * 625 * * Speed matters: In cryptography, exponentiation is done with 600-digit numbers.

Recursion vs. iteration Any recursive algorithm can be re-implemented as a loop instead – This is an “iterative” expression of the algorithm Any loop can be implemented as recursion instead Sometimes recursion is clearer and simpler – Mostly for data structures with a recursive structure Sometimes iteration is clearer and simpler