# Recursion October 5, 2009. Reading Read pp 197-221 in the text.

## Presentation on theme: "Recursion October 5, 2009. Reading Read pp 197-221 in the text."— Presentation transcript:

Recursion October 5, 2009

Fractals Self replicating functions

Recursive Definition Recursive definition of Recursion: If you don’t understand it, See "Recursion". Recursion is different from a circular definition, because recursion always has a base case which when reached, terminates the recursion. Circular definition of Recursion: See "Recursion".

Functions and Recursion Functions can call another function –We saw in last week’s class that you can call a function from the draw() function. Today we learn that a function can call itself -- (Exceptions: not draw() or setup() ) A function calling itself is an example of recursion. In order to end the recursion, there must be a base case.

static int radius; void setup() { size(300,300); smooth(); radius = width; drawCircle(width/2, height/2); stroke(0); } void drawCircle (int x, int y) { println("r = " + radius); if (radius<2) { return; //BASE CASE } else { //println("r = " + radius); ellipse(x, y, radius, radius); radius/=2; drawCircle(x,y); }

Can You Make the Sketch More Interesting? What about making the the circles not quite concentric? void drawCircle (int x, int y) { println("r = " + radius); if (radius>2) { //println("r = " + radius); fill(125,200,255, 75); ellipse(x, y, radius, radius); radius/=2; drawCircle(x+(int)random(radius/4),y+(int)random(radius/4)); }//implied else is the base case }

static int radius; void setup() { size(300,300); smooth(); drawCircle(width/2, height/2, width/2, height/2); stroke(0); } void drawCircle (float x, float y, float w, float h) { println("w = " + w); if (w<2.0) { //base case return; } else { println("w = " + w); ellipse(x, y, w, h); drawCircle(x-w/2,y, w/2, h/2); drawCircle(x+w/2,y, w/2, h/2); }

Edit it! Modify the preceding program so there is no fill. Change the size to 500 x 500 pixels. –Change the end case to be w<5. Do you like that better? Try a larger number. Can you replicate the existing design vertically, rather than horizontally? –Add those two lines to the program

Recursion + Experimentation + Random = fun! The following program illustrates how a simple example program can evolve over a basketball halftime into an interesting design. The program divides the screen into 4 parts in a very regular fashion. It became more interesting when randomness in terms of color, quadrant divided and rectangle placement was added.

int d1; int d2; void setup() { size(600, 600); stroke(255); background(0); } void draw() { frameRate(10); fill(random(100, 255), random(100, 255), random(100, 255), random(20- 40)); fillScreen(width, height, 0, 0); } void fillScreen(int d1, int d2, int x1, int y1) { if (d1 > 5) { if (((int)(random(0,2))%2) == 0) { /*fillScreen(d1 / 2, d2 / 2, (int)random(x1-d1/2, x1+d1/2), (int)random(y1-d2/2, y1+d2/2)); uncomment this and comment the next line for more abstract version*/

fillScreen(d1 / 2, d2 / 2, x1, y1); } else { fillScreen(d1 / 2, d2 / 2, x1+d1/2, y1); } else { if (((int)(random(0,2))%2) == 0) { fillScreen(d1 / 2, d2 / 2, x1, y1+d2/2); } else { fillScreen(d1 / 2, d2 / 2, x1+d1/2, y1+d2/2); }

stroke(100,random(100,200), random(100,150),random(100, 150)); int increment = (int)(random(1,2)+.5)%2; if (increment == 0) { rect(x1, y1, d1, d2); rect(x1, y1+d2, d1, d2); } else { rect(x1, y1, d2, d1); rect(x1+d2, y1, d2, d1); }

Exercise Begin with one of the sample programs from this powerpoint or from your text and experiment with it to produce an aesthetically pleasing design that doesn’t look derivative.

Similar presentations