CS 121 Today Fractals and Turtles! The Koch Curve how random…
When good programs go bad… def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p)
print: Making programs talk to you! Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs. - Maurice Wilkes Programming: the art of debugging an empty file. - The Jargon File
When good programs go bad… def power(b, p): """ Returns b**p for p >= 0 """ print ("p is", p, "; b is", b) if p == 0: return 1 else: return b*power(b, p)
Careful! print != return def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p-1) def powerPrint(b, p): """ Returns(?) b**p for p >= 0 """ if p == 0: print (1) else: print (b*powerPrint(b, p-1))
sum, range def sum(L): """ input: a list of numbers, L output: L's sum """
sum, range def sum(L): """ input: a list of numbers, L output: L's sum """ if len(L) == 0: return 0.0 else: return L[0] + sum(L[1:]) Base Case if the input has no elements, its sum is zero Recursive Case if L does have an element, add that element's value to the sum of the REST of the list… This input to the recursive call must be "smaller" somehow…
sum, range def range(low,hi): """ input: two ints, low and hi output: int list from low up to hi """ excluding hi
sum, range def range(low,hi): """ input: two ints, low and hi output: int list from low up to hi """ if hi <= low: return [] else: return excluding hi
sum, range def range(low,hi): """ input: two ints, low and hi output: int list from low up to hi """ if hi <= low: return [] else: return [low] + range(low+1,hi) excluding hi
A random aside… import random random.choice( L ) random.uniform(low,hi) random.choice( ['north', 'case', 'west'] ) random.uniform(41.9,42.1) chooses 1 element from the list L (with uniform probability) chooses a random float from low to hi for more explanation, try dir(random) or help(random) How likely is this to return 42 ? How would you get a random int from 0 to 9?
Randomness vs. Determinism Are there random numbers? Output RNG Can a computer generate them? A “ black box ” model of a random number generator.
Randomness vs. Determinism Are there random numbers?Can a computer generate them? The RNG revealed. Output YesNot without help! Periodic! p =
Some random history… True randomness is valuable! but not that valuable!
A random function… print the guesses ? return the number of guesses ? from random import * def guess( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) ) if compguess == hidden: # at last! print ('I got it!’) else: guess( hidden ) This is a bit suspicious… slow down…
The final version from random import * import time def guessFinal( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) ) print ('I choose', compguess) time.sleep(0.05) if compguess == hidden: # at last! print ('I got it!’) return 0 else: return 1 + guessFinal( hidden )
The two Monte Carlos Monte Carlo casino, Monaco Making random numbers work for you! Monte Carlo methods, Math/CS
Monte Carlo in action Suppose you roll two dice. What are the chances that you roll doubles? def countDoubles( N ): """ inputs a # of dice rolls outputs the # of doubles """ if N == 0: return 0 # zero rolls, zero doubles… else: d1 = choice( [1,2,3,4,5,6] ) d2 = choice( range(1,7) ) if d1 != d2: return countDoubles( N-1 ) # not doubles else: return # doubles! one roll of the dice where is the doubles check? input is the total number of rolls what should the last line be?
Monty Hall Let ’ s make a deal ’ 63- ’ 86 inspiring the “ Monty Hall paradox ”
Monte Carlo Monty Hall Suppose you always switch to the other door... What are the chances that you will win the car ? Run it (randomly) 1000 times and see!
Monte Carlo Monty Hall def MCMH( init, sors, N ): """ plays the same "Let's make a deal" game, N times returns the number of times you win the car """ if N == 0: return 0 # don't play, can't win carDoor = choice([1,2,3]) # where is the car? if init == carDoor and sors == 'stay': result = 'Car!' elif init == carDoor and sors == 'switch': result = 'Spam.' elif init != carDoor and sors == 'switch': result = 'Car!' else: result = 'Spam.' print ('You get the', result) if result == 'Car!': return 1 + MCMH( init, sors, N-1 ) else: return 0 + MCMH( init, sors, N-1 ) Your initial choice! 'switch' or 'stay' number of times to play
Python's Etch-a-Sketch A new human-computer interface? from turtle import * reset() left(90) forward(50) right(90) backward(50) down() or up() color('green') tracer(1) or tracer(0) width(5) done() and lots more! degrees! states if the pen draws or not states if the pen animates or not
Recursive Graphics def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120) there is no tri … Could we tri this with recursion? (1) Could we create any regular n-gon? (2)
def chai(size): """ mystery! """ forward(size) left(90) forward(size/2.0) right(90) forward(size) left(90) forward(size/2.0) right(90) backward(size) What does chai draw? (1) How could you add more to each end? Why are there two identical commands in a row?
Spiral spiral( initLength, angle, multiplier ) close-up of innermost part of the spiral… spiral( 100, 90, 0.9 )
svTree svTree( trunkLength, levels ) svTree( 100, 4 ) and more! (if you want)
Help! My turtle window froze! Your turtle window becomes unresponsive after your program runs. Type: >>> done() to unlock it (but then you have to close it)
The Koch curve snowflake( 100, 0 ) snowflake( 100, 1 )snowflake( 100, 2 ) snowflake( 100, 3 )snowflake( 100, 4 )snowflake( 100, 5 )
Have fun! fill(1)color("blue")