CS51 - Spring 2010 - Lecture 14

  • Exercise 12.1.13: What is it about broccoli that makes it challenging to try and write iteratively, even just to create it?

  • procedural recursion
       - so far, we've only looked at structural recursion
       - much more commonly seen in CS is what's called procedural recursion
          - writing a method that calls itself
       - similar to mathematical induction
       - basic idea
          - assume you have a method that does what you works, but it only works on problems that are smaller than your current problem
          - how can you use this method to solve the larger problem...
       - steps for procedural recursion
          - define the recursion in words
          - assume you have a method that works for smaller problems, define the solution to the larger problem with respect to this method
          - base case: when does the recursion end?
             - determine for what input(s) the method will stop and
             - what the answer is for that input
          - write the method
             - first, check for the base case and take the appropriate base case action
             - otherwise
                - do the recursive case
                - make a "recursive" call to your method on something that is smaller

  • summing up the numbers from 1 to some input, n
       private int sum(int n){
          ...
       }

       - iterative version:
          private int sum(int n){
             int totalSum = 0;

             while( n > 0 ){
                totalSum += n;
                n--;
             }

             return totalSum;
          }

       - recursive version:
          - how can we define this recursively (in words)?
             - the sum of the numbers from 1...n is n plus the sum of the numbers from 1...n-1
          - what is our recursive case?
             - sum(n) = n + sum(n-1)
          - what is our base case? When do we stop?
             - if n is equal to 1, then we know that the sum is 1
          - write the method:

          private int sum(int n){
             if( n == 1 ){
                return 1;
             } else {
                return n + sum(n-1);
             }
          }
       - why does this work?
          - first, we call it with n
          - we return n plus whatever is returned by sum(n-1)
          - which returns n-1 plus whatever is returned by sum(n-2)
          - so we get n + n-1 + n-2 + n-3 + ...
          - eventually, n == 1 and we return a 1
          - so our final sum is: n + n-1 + n-1 + n-3 + ... + 1, which is what we wanted
          
  • show Powers demo
       - we want to calculate base to the power n
       - how can we do this?
          - basic idea is that we want to multiply 1 times base n times
       - iteratively:

          private double itPower(double base, long n){
             double ans = 1.0;
              while (n > 0) {
                 ans = ans * base;
                 n--;
              }
       
             return ans;
          }

       - recursively:
          - how can we define this recursively (in words)? Remember, just assume you have a method that does what you want it to do, but for smaller problems
             - the base^n is base times base^(n-1)
          - what is our recursive case:
             - power(base, n) = base * power(base, n-1)
          - what is our base case
             - when n == 0 we should just return 1
             - alternatively, when n == 1, we could just return base
             - either one is fine! what would be the difference?
          - write the method:
          
          private double power(double base, long n) {
             if (n == 0) {
                return 1;
             } else {
                return base * power(base, n - 1);
             }
          }

          - why does this work?
             - first we call it with base and n
             - we return base times whatever is returned by power(base, n-1)
             - which returns base times whatever is returned by power(base, n-2)
             - so we best base * base * base * ...
             - eventually, n == 0 and we return 1, so we get:
             - base * base * base * ... * base * 1, where base is multiplied n times since each time we reduce n by 1

  • show Hanoi demo
       - called towers of hanoi
       - invented in 1883 by French mathematician Edouard Lucas (http://en.wikipedia.org/wiki/Tower_of_Hanoi)
       - simple game:
          - move the tower from the left side to the right
          - you may only move one disc at a time
          - you may only place a smaller disc on top of a larger disc
       - how do you solve this? Recursion!
          - harder to solve iteratively
       - how can we define this recursively (in words)?
          - to solve the puzzle:
             - move the top n-1 discs to the center peg
             - move the bottom disk to the right peg
             - move the n-1 discs on the center peg to the right peg
          - can we generalize this?
             - three pegs
                - current
                - destination
                - other
             - want to move n discs from current to destination
                - move top n-1 discs from current to other
                - move bottom disc to destination
                - move n-1 discs from other discs to destination
       - what is the base case?
          - there are no discs to be moved, don't do anything
       hanoi(n, current, destination, other){
          if( n == 0 ){
             // don't do anything, just stop the recursion
          }else{
             hanoi(n-1, current, other, destination)
             move the bottom disc to destination
             hanoi(n-1, other, destination, current)
          }
       }

  • midterm review
       - close book, closed notes, etc.
       - we will give you copies of:
          - Objectdraw quick reference
          - GUI cheat sheet
       - types of questions
          - 1-2 code this up problems
          - 1-2 what does this code do problems
          - a few short answer questions
       - will cover all the material before recursion (will not have any questions on recursion)
       - topics (roughly)
          - basic programming
             - variables
                - instance
                - local
                - constants
             - methods
             - classes
             - parameters
             - commenting
          - objectdraw components
          - booleans
          - if-else
          - ints and doubles
          - while loops
          - active objects
          - defining and manipulating multiple classes
          - GUIs
          - randomness
          - colors
          - images
          - audio
          - interfaces

  • look at Lab 7