Summary. csci 210: Data Structures Recursion. Recursive algorithms. Recursion. Topics READING:

Similar documents
csci 210: Data Structures Recursion

Taking Stock. IE170: Algorithms in Systems Engineering: Lecture 5. The Towers of Hanoi. Divide and Conquer

CMPSCI 187: Programming With Data Structures. Lecture #15: Thinking Recursively David Mix Barrington 10 October 2012

2.3 Recursion. Overview. Mathematical Induction. What is recursion? When one function calls itself directly or indirectly.

Recursion. Chapter 7. Copyright 2012 by Pearson Education, Inc. All rights reserved

Complexity, Induction, and Recurrence Relations. CSE 373 Help Session 4/7/2016

Induction and Recursion. CMPS/MATH 2170: Discrete Mathematics

2.3 Recursion. Overview. Greatest Common Divisor. Greatest Common Divisor. What is recursion? When one function calls itself directly or indirectly.

2.3 Recursion. Overview. Greatest Common Divisor. Greatest Common Divisor. What is recursion? When one function calls itself directly or indirectly.

Recursive Definitions

Overview. What is recursion? When one function calls itself directly or indirectly.

APCS-AB: Java. Recursion in Java December 12, week14 1

Recursion. Dr. Jürgen Eckerle FS Recursive Functions

! New mode of thinking. ! Powerful programming paradigm. ! Mergesort, FFT, gcd. ! Linked data structures.

CSC-140 Assignment 4

Recursion Chapter 3.5

Recursion. Chapter 5

Recursion. Chapter 7

CMSC 132: Object-Oriented Programming II. Recursive Algorithms. Department of Computer Science University of Maryland, College Park

Lecture P6: Recursion

Recursion (Rosen, 6 th edition, Section 4.3, 4.4)

Department of Computer Science Yale University Office: 314 Watson Closely related to mathematical induction.

CmpSci 187: Programming with Data Structures Spring 2015

Solutions to Problem 1 of Homework 3 (10 (+6) Points)

CSE 214 Computer Science II Recursion

Recursion. Jordi Cortadella Department of Computer Science

Chapter 15: Recursion

Recursion Chapter 17. Instructor: Scott Kristjanson CMPT 125/125 SFU Burnaby, Fall 2013

Recursive Sequences. Lecture 24 Section 5.6. Robb T. Koether. Hampden-Sydney College. Wed, Feb 27, 2013

Recursive Sequences. Lecture 24 Section 5.6. Robb T. Koether. Hampden-Sydney College. Wed, Feb 26, 2014

Recursion. What is Recursion? Simple Example. Repeatedly Reduce the Problem Into Smaller Problems to Solve the Big Problem

Counting Problems; and Recursion! CSCI 2824, Fall 2012!

Lecture 24 Tao Wang 1

CS 112 Introduction to Programming

11/2/2017 RECURSION. Chapter 5. Recursive Thinking. Section 5.1

Reading 8 : Recursion

Recursion CSCI 136: Fundamentals of Computer Science II Keith Vertanen Copyright 2011

STUDENT LESSON A9 Recursion

CS 3410 Ch 7 Recursion

Hanoi, Counting and Sierpinski s triangle Infinite complexity in finite area

Recursive Methods and Problem Solving. Chris Kiekintveld CS 2401 (Fall 2010) Elementary Data Structures and Algorithms

Lecture Notes 4 More C++ and recursion CSS 501 Data Structures and Object-Oriented Programming Professor Clark F. Olson

recursive algorithms 1

Test Bank Ver. 5.0: Data Abstraction and Problem Solving with C++: Walls and Mirrors, 5 th edition, Frank M. Carrano

Recursion. Fundamentals of Computer Science

12/30/2013 S. NALINI,AP/CSE

Divide & Conquer. 2. Conquer the sub-problems by solving them recursively. 1. Divide the problem into number of sub-problems

COMP 250 Fall Recursive algorithms 1 Oct. 2, 2017

Recursion. Overview. Mathematical induction. Hello recursion. Recursion. Example applications. Goal: Compute factorial N! = 1 * 2 * 3...

Recursive Thinking. Chapter 8: Recursion. Recursive Definitions. Recursion. Java Software Solutions for AP* Computer Science A 2nd Edition

CSC 273 Data Structures

q To develop recursive methods for recursive mathematical functions ( ).

q To develop recursive methods for recursive mathematical functions ( ).

2.3 Recursion 7/23/2015 3:06:35 PM

Recursion. Let s start by looking at some problems that are nicely solved using recursion. First, let s look at generating The Fibonacci series.

Analyzing Complexity of Lists

def F a c t o r i a l ( n ) : i f n == 1 : return 1 else : return n F a c t o r i a l ( n 1) def main ( ) : print ( F a c t o r i a l ( 4 ) )

COMP-202. Recursion. COMP Recursion, 2013 Jörg Kienzle and others

Announcements. Recursion and why study it. Recursive programming. Recursion basic idea

Recursive definition of sets and structural induction

Two Approaches to Algorithms An Example (1) Iteration (2) Recursion

Exercise 1: Tail Sum of Squares (2 points) Homework 3 READ THIS BEFORE YOU BEGIN:

Odds and Ends. Think about doing research Programming grading. Assignment 3 due Tuesday

Solving problems by recursion

CMSC 150 LECTURE 7 RECURSION

Identify recursive algorithms Write simple recursive algorithms Understand recursive function calling

Lesson 12: Recursion, Complexity, Searching and Sorting. Modifications By Mr. Dave Clausen Updated for Java 1_5

Michele Van Dyne Museum 204B CSCI 136: Fundamentals of Computer Science II, Spring

Data Abstraction & Problem Solving with C++: Walls and Mirrors 6th Edition Carrano, Henry Test Bank

UNIT 5A Recursion: Basics. Recursion

CSE 2123 Recursion. Jeremy Morris

1.7 Recursion. Department of CSE

CS200: Recursion and induction (recap from cs161)

Chapter 13 Recursion. Chapter Objectives

34. Recursion. Java. Summer 2008 Instructor: Dr. Masoud Yaghini

To illustrate what is intended the following are three write ups by students. Diagonalization

CSC 148 Lecture 3. Dynamic Typing, Scoping, and Namespaces. Recursion

mith College Computer Science Week 13 CSC111 Spring 2018 Dominique Thiébaut

SECTION 5.1. Sequences

CSE 373: Data Structures and Algorithms

CS/CE 2336 Computer Science II

Introduction to Computers & Programming

Goals: Define computational problem instance of a computational problem algorithm pseudocode Briefly discuss recursive procedure big-o notation

CSE 20 DISCRETE MATH WINTER

26 Feb Recursion. Overview. Greatest Common Divisor. Greatest Common Divisor. Greatest Common Divisor. Greatest Common Divisor

2.3 Recursion 7/21/2014 5:12:34 PM

Recursion. Chapter 17 CMPE13. Cyrus Bazeghi

EECS 2011M: Fundamentals of Data Structures

TECH. Recurrence Equations vs. Recursive Procedures. Recursion and Induction. e.g. Fibonacci Function. The working of recursive procedure

Recursion. Example R1

CISC 3115 TY3. C21a: Recursion. Hui Chen Department of Computer & Information Science CUNY Brooklyn College. 11/6/2018 CUNY Brooklyn College

Recursion: The Beginning

EE 368. Weeks 4 (Notes)

Algorithmic Methods Tricks of the Trade

We will give examples for each of the following commonly used algorithm design techniques:

Lecture 6: Combinatorics Steven Skiena. skiena

Recursion. Thinking Recursively. Tracing the Recursive Definition of List. CMPT 126: Lecture 10. Recursion

Recursion. move(64, 1, 2, 3);

Recursion is a fundamental programming technique that can provide an elegant solution certain kinds of problems. COMP Week 8 & 9 1

CSE11 Lecture 20 Fall 2013 Recursion

Transcription:

Summary csci 210: Data Structures Recursion Topics recursion overview simple eamples Sierpinski gasket counting blobs in a grid Hanoi towers READING: LC tetbook chapter 7 Recursion Recursive algorithms A method of defining a function in terms of its own definition Eample: the Fibonacci numbers f (n) = f(n-1) + f(n-2) f(0) = f(1) = 1 base case To solve a probleme recursively break into smaller problems solve sub-problems recursively assemble sub-solutions Problem solving technique: Divide-and-Conquer In programming recursion is a method call to the same method. In other words, a recursive method is one that calls itself. Why write a method that calls itself? Recursion is a good problem solving approach solve a problem by reducing the problem to smaller subproblems; this results in recursive calls. Recursive algorithms are elegant, simple to understand and prove correct, easy to implement But! Recursive calls can result in a an infinite loop of calls recursion needs a base-case in order to stop Recursion (repetitive structure) can be found in nature shells, leaves recursive-algorithm(input) { //base-case if (issmallenough(input)) compute the solution and return it else //recursive case break input into simpler instances input1, input 2,... solution1 = recursive-algorithm(input1) solution2 = recursive-algorithm(input2)... figure out solution to this problem from solution1, solution2,... return solution }

Eample Eample Write a function that computes the sum of numbers from 1 to n int sum (int n) Write a function that computes the sum of numbers from 1 to n int sum (int n) 1. use a loop 2. recursively 1. use a loop 2. recursively //with a loop int sum (int n) { int s = 0; } for (int i=0; i<n; i++) s+= i; return s; //recursively int sum (int n) { int s; } if (n == 0) return 0; //else s = n + sum(n-1); return s; How does it work? Recursion sum(10) return 10 + 45 sum(9) return 9 + 36 sum(8) return 8 + 28 How it works Recursion is no different than a function call The system keeps track of the sequence of method calls that have been started but not finished yet (active calls) order matters Recursion pitfalls miss base-case infinite recursion, stack overflow no convergence solve recursively a problem that is not simpler than the original one return 1+0 sum(1) return 0 sum(0)

Perspective Recursion eamples Recursion leads to solutions that are compact simple easy-to-understand easy-to-prove-correct Sierpinski gasket Blob counting Towers of Hanoi Recursion emphasizes thinking about a problem at a high level of abstraction Recursion has an overhead (keep track of all active frames). Modern compilers can often optimize the code and eliminate recursion. First rule of code optimization: Don t optimize it..yet. Unless you write super-duper optimized code, recursion is good Mastering recursion is essential to understanding computation. Sierpinski gasket Blob check see Sierpinski-skeleton.java Fill in the code to create this pattern Problem: you have a 2-dimensional grid of cells, each of which may be filled or empty. Filled cells that are connected form a blob (for lack of a better word). Write a recursive method that returns the size of the blob containing a specified cell (i,j) Eample 0 1 2 3 4 0 1 2 3 4 BlobCount(0,3) = 3 BlobCount(0,4) = 3 BlobCount(3,4) = 1 BlobCount(4,0) = 7 Solution? essentially you need to check the current cell, its neighbors, the neighbors of its neighbors, and so on think RECURSIVELY

Blob check Blob check when calling BlobCheck(i,j) blobcheck(i,j): if (i,j) is FILLED (i,j) may be outside of grid 1 (for the current cell) (i,j) may be EMPTY + count its 8 neighbors (i,j) may be FILLED When you write a recursive method, always start from the base case What are the base cases for counting the blob? given a call to BlobCkeck(i,j): when is there no need for recursion, and the function can return the answer immediately? //first check base cases if (outsidegrid(i,j)) return 0; if (grid[i][j]!= FILLED) return 0; blobc = 1 for (l = -1; l <= 1; l++) for (k = -1; k <= 1; k++) //skip of middle cell if (l==0 && k==0) continue; //count neighbors that are FILLED Base cases if (grid[i+l][j+k] == FILLED) blobc++; (i,j) is outside grid (i,j) is EMPTY Does not work: it does not count the neighbors of the neighbors, and their neighbors, and so on. Instead of adding +1 for each neighbor that is filled, need to count its blob recursively. Blob check Marking your steps blobcheck(i,j): if (i,j) is FILLED 1 (for the current cell) + count blobs of its 8 neighbors Idea: once you count a cell, mark it so that it is not counted again by its neighbors. //first check base cases if (outsidegrid(i,j)) return 0; if (grid[i][j]!= FILLED) return 0; blobc = 1 blobcheck(1,1) * for (l = -1; l <= 1; l++) for (k = -1; k <= 1; k++) //skip of middle cell if (l==0 && k==0) continue; blobc += blobcheck(i+k, j+l); count it and mark it blobc=1 then find counts of neighbors, recursively Eample: blobcheck(1,1) blobcount(1,1) calls blobcount(0,2) blobcount(0,2) calls blobcount(1,1) + blobcheck(0,0) + blobcheck(0,1) +blobcheck(0,2)... Does it work? Problem: infinite recursion. Why? multiple counting of the same cell

Correctness Try it out! blobcheck(i,j) works correctly if the cell (i,j) is not filled if cell (i, j) is FILLED mark the cell the blob of this cell is 1 + blobcheck of all neighbors because the cell is marked, the neighbors will not see it as FILLED ==> a cell is counted only once! Download blobcheckskeleton.java from class website! Fill in method blobcount(i,j) Why does this stop? blobcheck(i,j) will generate recursive calls to neighbors recursive calls are generated only if the cell is FILLED when a cell is marked, it is NOT FILLED anymore, so the size of the blob of filled cells is one smaller ==> the blob when calling blobcheck(neighbor of i,j) is smaller that blobcheck(i,j) Note: after one call to blobcheck(i,j) the blob of (i,j) is all marked need to do one pass and restore the grid 18 Towers of Hanoi Find the set of moves for n=3 Consider the following puzzle There are 3 pegs (posts) a, b, c and n disks of different sizes Each disk has a hole in the middle so that it can fit on any peg At the beginning of the game, all n disks are on peg a, arranged such that the largest is on the bottom, and on top sit the progressively smaller disks, forming a tower Goal: find a set of moves to bring all disks on peg c in the same order, that is, largest on bottom, smallest on top a b c constraints the only allowed type of move is to grab one disk from the top of one peg and drop it on another peg a larger disk can never lie above a smaller disk, at any time The legend says that the world will end when a group of monks, somewhere in a temple, will finish this task with 64 golden disks on 3 diamond pegs. Not known when they started.... a b c a b c

Solving the problem for any n Solving the problem for any n Problem: move n disks from A to C using B Think recursively. Can you epress the problem in terms of a smaller problem? Subproblem: move n-1 disks from X to Y using Z Problem: move n disks from A to C using B Think recursively. Can you epress the problem in terms of a smaller problem? Subproblem: move n-1 disks from X to Y using Z Recursive formulation of Towers of Hanoi : move n disks from A to C using B move top n-1 disks from A to B move bottom disks from A to C move n-1 disks from B to C using A Correctness How would you go about proving that this is correct? Hanoi-skeleton.java Correctness Look over the skeleton of the Java program to solve the Towers of Hanoi It s supposed to ask you for n and then display the set of moves no graphics finn in the gaps in the method public void move(sourcepeg, storagepeg, destinationpeg) Proving recursive solutions correct is done with mathematical induction Induction: a technique of proving that some statement is true for any n (natural number) known from ancient times (the Greeks) Induction proof: Base case: prove that the statement is true for some small value of n, usually n=1 The induction step: assume that the statement is true for all integers <= n-1. Then prove that this implies that it is true for n. Eercise: try proving by induction that 1 + 2 + 3 +... + n = n (n+1)/2 Proof sketch for Towers of Hanoi: Base case: It works correctly for moving one disk. Assume it works correctly for moving n-1 disks. Then we need to argue that it works correctly for moving n disks. A recursive solution is similar to an inductive proof; just that instead of inducting from values smaller than n to n, we reduce from n to values smaller than n (think n = input size) the base case is crucial: mathematically, induction does not hold without it; when programming, the lack of a base-case causes an infinite recursion loop

Analysis How close is the end of the world? Let s estimate running time. The running time of recursive algorithms is estimated using recurrent functions. Let T(n) be the time to compute the sequence of moves to move n disks from one peg to another. We have T(n) = 2T(n-1) + 1, for any n > 1 T(1) = 1 (the base case) The recurrence solves to T(n) = O(2 n ) [Csci 231] It can be shown by induction that T(n) = 2 n -1 [Math 200, Csci 231] This means, the running time is eponential in n slow... Eercise: 1GHz processor, n = 64 => 2 64 10-9 =... a log time; hundreds of years