89
1-303 Discrete Maths: Recursion/3 Discrete Maths Objective to show the close connection betwe en recursive definitions, recursiv e functions, and recursive (induct ive) proofs 241-303, Semester 1 2014-2015 3. Recursion

Discrete Maths 3. Recursion Objective

Embed Size (px)

DESCRIPTION

Overview 1. Recursive Definitions 2. Recursive Functions 3. Lists Recursively 4. Trees Recursively 5. Hilbert Curves 6. Proving Recursive Programs Work 7. Further Information

Citation preview

Page 1: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 1

Discrete Maths

• Objective– to show the close connection between rec

ursive definitions, recursive functions, and recursive (inductive) proofs

241-303, Semester 1 2014-2015

3. Recursion

Page 2: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 2

Overview

1. Recursive Definitions2. Recursive Functions3. Lists Recursively4. Trees Recursively5. Hilbert Curves6. Proving Recursive Programs Work7. Further Information

Page 3: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 3

1. Recursive Definitions

• A recursive definition involves:– 1. One or more basis rules, in which simple thin

gs are defined, and

– 2. One or more recursive (inductive) rules, where larger things are defined in terms of ‘smaller’ versions of those things.

Page 4: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 4

Examples

23

57 19

5 4left

subtreeright

subtree

• A tree is made from left and right subtrees.

the leaves are the basis

Page 5: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 5

Sierpinski Gasket

• Start with a triangle and cut out the middle piece as shown. This results in three smaller triangles to which the process is continued.

Use recursion to createstrange shapes

Page 6: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 6

3D Sierpinski Gasket

Page 7: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 7

Menger Sponge

removecenter square

repeat for the 8small squares

Page 8: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 8

• For many problems, recursive definitions are the natural way of specifying the problems– e.g. search over trees/graphs, parsing,

• Recursive definitions are very close to inductive statements, and so are usually easier to prove than loop invariants.

Why Bother with Recursive Definitions?

Page 9: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 9

1.1. Factorial, Recursively

• Remember that n! is 1*2*3*...*n.

• A recursive definition of n!:– Basis. 1! = 1

– Induction. n! = n * (n-1)!

it's inductive because the meaning of n! is defined using the smaller (n-1)!

Page 10: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 10

Prove the Specification Correct

• Prove the inductive statement S(n): – the recursive definition of n!, as defined

on the last slide, equals 1*2*3*...*n

• Basis. S(1) is clearly true.

continued

Show recursive n! is the same as a series of multiplications.

Page 11: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 11

• Induction. Assume that S(n) is true, which means that n! = 1*2*3...*n

• The recursive definition states that:– (n+1)! = (n+1) * n!– so, (n+1)! = n! * (n+1)– substitute in n! value from S(n), so

(n+1)! = 1*2*3*...n*(n+1)• This is S(n+1), so S(n) --> S(n+1) is true.

continued

Page 12: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 12

• In summary:– we have shown S(1) to be true– we have shown S(n) --> S(n+1) to be true

• This means that S(n) is true for all n >= 1:– the recursive definition of n! equals 1*2*3*...*n

• Why is this useful?– the correct recursive definition can be easily converted into a

correct recursive function

Page 13: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 13

1.2. Recursive Definition of Expressions

• We will look at expressions involving binary operators (e.g. +, *, /)– e.g X*2, (Y/3)*(W+2), X

• The variables/numbers in an expressions are called operands.

• Basis. An operand on its own is an expression (e.g. X).

continued

Page 14: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 14

Inductive Rules

• 1. If E1 and E2 are expression, and @ is a binary operator (e.g., +, *), then E1@E2 is an expression.

• 2. If E is an expression, then (E) is an expression.

• Examples: 5, X, 2+s, (X*Y) - 1

Page 15: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 15

An Induction Proof Using Length

• S(n): A binary operator expression E of length n has one more operand than operators.

• For example: len operands ops– X 1 1 0– (2*y)+3 7 3 2

continued

Page 16: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 16

• Examples:– S(1) 1 y X a 2– S(3) 2+a X*Y 3-s (x)– S(5) (1+d) 5*6-2

• Note: the examples suggest that S(2), S(4), S(6), etc. may not exist.

the length of the expression

continued

Page 17: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 17

• The proof of S(n) is by complete induction on the length of the expression:– length is counted as the number of operators, oper

ands and parentheses

• Basis. n=1. E must be a single operand (e.g. X). Since there are no operators, the basis holds.– e.g. the first examples on the last slide

continued

Page 18: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 18

• Induction: Assume S(1), S(2),..., S(n), and show that:– (S(1) or S(2) or … or S(n)) --> S(n+1)– this is complete induction.

• Let the expression for S(n+1) be called E.

• How can E be constructed?– there are two cases, corresponding to the two inductive ru

les

continued

Page 19: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 19

• a) If by rule (2), E = (E1)• Assume true: no of operands no of ops|

E1 x+1 x

• Prove E E = (E1) x+1 x

• So S(n+1) holds when E has the form (E1)

continued

Page 20: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 20

• b) If by rule (1), then E = E1@E2

• Assume true: no of operands no of ops|E1 a+1 aE2 b+1 b

• Prove E E = E1@E2 a+b+2 a+b+1

• So S(n+1) holds when E has the form E1@E2

continued

Page 21: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 21

• S(n+1) is true for both forms of E– this was proved by assuming that smaller expre

ssions (E1, E2) were true

– any smaller expression can be used since we are using complete induction

continued

Page 22: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 22

• In summary:– shown S(1) to be true– shown (S(1) or S(2) .. or S(n)) --> S(n+1) true

• This means that S(n) is true for all n >= 1:– a binary operator expression E of length n has one more operand tha

n operators

• Why is this useful?– the correct recursive definition can be easily converted into a correct

recursive function, which can be used in compilers

complete induction

Page 23: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 23

Notes

• We used all of S(1), ...S(n) in the inductive step, since we considered the subexpressions that made up E.

• Using subexpressions was only possible because expression was defined recursively in terms of subexpressions.

Page 24: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 24

2. Recursive Functions

• A recursive function is one that is called from within its own body– direct call: a function F() has a call to F() within it

self– indirect call: a function F1() calls F2() which calls

F3(), ... and eventually F1() is called

• Recursive definitions map easily to recursive functions.

Page 25: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 25

2.1. Factorial Code• The recursive definition of n! was:

– Basis. 1! = 1– Induction. n! = n * (n-1)!

• As a function:int fact(int n){ if (n <= 1) return 1; /* basis */ else return n * fact(n-1); /*induction*/}

a simpletranslation

Page 26: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 26

Understanding Recursive Execution

• Draw function calls as boxes, each containing the variables (and values) in that function call.

• Example:void main(){ int res = fact(4); printf(“%d”, res);}

Page 27: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 27

Diagram

main

n

res=fact(4)

fact

4return...

nfact

3return...

nfact

2return...

nfact

1return...

• The trick is to remember that there are multiple calls to fact().

Page 28: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 28

2.2. Convert int to binary

• The simplest algorithm for converting an integer to binary is recursive.

• It will translate:610 to 1102

1310 to 11012

continued

Page 29: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 29

• For an integer i > 0, convert it to binary as:– last bit is i%2

• '%' gives the remainder, so 9%4 == 1– leading bits are obtained by converting i/2 u

ntil i == 0• '/' is integer division, so 9/2 == 4

Page 30: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 30

Typical Looping Solution

void main(){ int i;

scanf(“%d”, &i); while (i > 0) { putchar(‘0’ + i%2); i = i/2; } putchar(‘\n’);}

i at start i/2 i%2 6 3 0 3 1 1 1 0 1 0

Input: 6Output: 011

Page 31: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 31

• Major problem: the answer comes out backwards:

610 is converted to 0112

• Fixing the looping version is much harder than writing a recursive definition of the algorithm.

Page 32: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 32

Recurive Definition

• Convert i to binary.– Basis. If i == 0, do nothing

– Induction. If i > 0, thenconvert i/2 , thenprint the bit i%2

it's inductive because the convert definitionfor i is defined using convert of i/2

Page 33: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 33

Recursive Code

void convert(int i){ if (i > 0) { convert(i/2); putchar(‘0’ + i%2); }}

void main(){ int i; scanf(“%d”, &i); convert(i); putchar(‘\n’);}

Page 34: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 34

Diagram

main

i

convert(6)

convert

6

iconvert

3

iconvert

1

iconvert

0

i 6

do nothing;return

convert(i/2);putchar(i%2)

convert(i/2);putchar(i%2)

convert(i/2);putchar(i%2)Input: 6

Output: 110

Page 35: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 35

2.3. Walking Robot

• A robot can take steps of 1 meter or 2 meters.

• Develop an algorithm to calculate the number of ways the robot can walk n meters.

More complex versions of this problemoccur in real robot controllers.

Page 36: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 36

Examples

• Distance n Seq. of Steps No. of Ways

to walk n meters 1 1 1

2 1,1 or 2 2

3 1,1,1 or 1,2 or 2,1 3

4 1,1,1,1 or 1,1,2 or1,2,1 or 2,1,1 or 2,2 5

Page 37: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 37

Recursive Definition

• Basis. No. of ways to walk 1 meter = 1. No. of ways to walk 2 meters = 2.

• Induction. No. of ways to walk n meters (n > 2) is the sum of:– no. of ways to walk n-1 (after a 1-step), plus– no. of ways to walk n-2 (after a 2-step)

Page 38: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 38

Recursive Code

int numWays(int n){ if ((n == 1) || (n == 2)) return n; else return numWays(n-1) +

numWays(n-2));}

Page 39: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 39

Table of Results• Distance to Walk No. of Ways

1 12 23 34 55 86 13

• This sequence of number of ways is a Fibonacci sequence. It appears in many places in maths (and computing).

Page 40: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 40

3. Lists Recursively

• The list data structure has a natural recursive definition (and implementation).

• When a data structure is recursive, functions for manipulating it are naturally recursive as well.– e.g. length of a list– e.g. is an element in a list?

Page 41: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 41

3.1. Recursive Definition• A list can be:

– Basis. Empty– Induction. A non-empty list consists of one nod

e (the head), followed by a list (the tail).

• Example:

23 5 7 19 5 4

tailhead

Page 42: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 42

3.2. Recursive Implementation

• Unfortunately, recursive data structures in C have to be implemented with pointers. – this is not true in many other languages, such as

Java, Haskell, Prolog, etc.

• Also, empty pointer data structures are usually coded using NULL.

continued

Page 43: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 43

The LIST Type

• struct CELL { int element; struct CELL *next;}

typedef struct CELL *LIST;

• Note. LIST can only hold integer elements.

Page 44: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 44

Diagrams of C Lists

w19 5 4

NULL

NULL

wan empty list

a 3-element list

Page 45: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 45

Example

void main(){ LIST w = NULL; /* an empty list */

w = makeList(); /* build a list */ : if (w != NULL) printList(w);

: :

Page 46: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 46

3.3. The length of a list

• The recursive definition of length follows the recursive definition of the list d.s:– Basis. The length of an empty list is 0.

– Induction. The length of a non-empty list is 1 + the length of the list tail.

Page 47: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 47

length()

int length(LIST w){ if (w == NULL) /* is w empty? */ return 0; else return 1 + length(w->next); }

Page 48: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 48

3.4. Is element x in the list?

• A recusive definition:– Basis. If the list is empty, then x is not in the list. R

eturn False (0).

– Induction. If the list is non-empty then:• 1. If x is the same as the list head, return True (1).• 2. If x is not the same as the head, then return the result

of examining the list tail.

Page 49: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 49

hasElement()

int hasElement(LIST w, int x){ if (w == NULL) /* empty? */ return 0; /* false */ else if (x == w->element) return 1; /* true */ else return hasElement(w->next, x);}

Page 50: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 50

3.5. A General Recursive Format• Most list functions have the “shape”:

ResultType fun(LIST w, ...){ if (w == NULL) return somethingSimple; else {

use w->element; ... fun(w->next, ...);

return result; }

}

Learn (and understand) this.

Page 51: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 51

4. Trees Recursively• The tree data structure has a natural recursiv

e definition (and implementation).

• Tree functions are naturally recursive:– e.g. the number of elements in a tree– e.g. is an element in a tree?

• Using loops in tree functions usually means BIG CODING MISTAKES.

Page 52: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 52

4.1. Recursive Definition• A binary tree can be:

– Basis. Empty– Induction. A non-empty tree consists of a node, a

nd left and right sub-trees (which may be empty).

23

57 19

5 4left

subtree

rightsubtree

Page 53: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 53

4.2. The TREE Type

• struct CELL { int element; struct CELL *left; struct cell *right;}

typedef struct CELL *TREE;

• Note. TREE can only hold integer element.

Page 54: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 54

Diagrams of C Trees

p 2

1 4

5

N N

NNN

a 4-element tree(N means NULL)

NULL

pan empty tree

Page 55: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 55

Example

void main(){ TREE p = NULL; /* an empty tree */

p = makeTree(); /* build a tree */ : if (p != NULL) printTree(p);

: :

Page 56: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 56

4.3. The number of elements in a tree

• The recursive definition of numElem follows the recursive definition of the tree d.s:– Basis. The numElem of an empty tree is 0.

– Induction. The numElem of a non-empty tree is: 1 + numElem of left subtree + numElem of right subtree

Page 57: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 57

numElem()

int numElem(TREE w){ if (w == NULL) /* is w empty? */ return 0; else return 1 + numElem(w->left) +

numElem(w->right); }

Page 58: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 58

4.4. Is element x in the tree?

• A recusive definition:– Basis. If the tree is empty, then x is not in the tree. R

eturn False (0).

– Induction. If the tree is non-empty then:• 1. If x is the same as the element, return True (1), or• 2. If x is in the left subtree, return True (1), or• 3. If x is in the right subtree, return True (1), or• 4. Return False.

Page 59: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 59

hasElement()int hasElement(TREE w, int x){ if (w == NULL) /* empty? */ return 0; /* false */ else if (x == w->element) return 1; else if (hasElement(w->left, x)) return 1; /* true */ else return hasElement(w->right, x);}

• Note: the last else combines cases 3 and 4.

Page 60: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 60

4.5. A General Recursive Format

• Most tree functions will have the “shape”:ResultType fun(TREE w, ...){ if (w == NULL) return somethingSimple; else {

use w->element; ... fun(w->left, ...); ... fun(w->right, ...);

return result; }

}

Learn (and understand) this.

Page 61: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 61

5. Hilbert Curves• Hilbert Curves are one kind of curve based on fract

als.

• Fractals are complex-looking shapes that are constructed by combining smaller basic shapes– fractals appear in nature (e.g. mountain/river shapes), an

d in computer games!

• They are easy to program recursively.

Page 62: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 62

Hilbert Curves of order 1, 2, and 3

H1

H2

H3

drawing starts at the top right corner

Page 63: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 63

Hilbert Curve, order 6

• This shows why curves of this type are often called “space-filling”.

H6

drawingstarts here

Page 64: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 64

5.1. Recursively Defining Hi

• H1 is• Hi is obtained by the composition of four instanc

es of Hi-1 of half size and appropriate rotation, and by tieing together the four Hi-1’s by three connecting lines.

• Four possible rotations:– any of these can be used to build H2, H3, etc.

Page 65: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 65

Hilbert Curves Again

H1

H2

H3

• For each curve, drawing starts at top right hand corner.

X

Y

Page 66: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 66

From Specification to Code

• Instead of recursively defining Hi using Hi-1, we will use a different approach.

• Four recursive drawing functions will be defined: Ai, Bi, Ci, Di

• Hi will be drawn by calling Ai

Page 67: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 67

Drawing Function

• Ai, Bi, Ci, Di have recursive definitions using Ai-1, Bi-1, Ci-1, Di-1.

• There are also basis drawings A1, B1, C1, D1

Page 68: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 68

Basis Drawings

A1

the arrow is thedrawing direction

on the screen

B1

C1

D1

Page 69: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 69

Recursive Drawings

Ai:Ai-1 Di-1

Ai-1 Bi-1

Bi:Bi-1 Bi-1

Ci-1 Ai-1

Ci:Di-1 Ci-1

Bi-1 Ci-1

Di:Ci-1 Ai-1

Di-1 Di-1

these are the connecting lines between the drawing operations

Page 70: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 70

5.2. Hilbert Curve Drawing Pseudo-code

#define WIDTH 512

/* global variables */int incr, x, y;

void main(){ int level; x = WIDTH; y = WIDTH; scanf(“%d”, &level); incr = WIDTH/pow(2,level); setplot(x,y); /* top right of plotter */ a(level); /* start with A */}

:

Draw Hlevel

x

y

Page 71: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 71

void a(int i) { if (i > 0) { d(i-1); x -= incr; plot(x,y); a(i-1); y -= incr; plot(x,y); a(i-1); x += incr; plot(x,y); b(i-1); } }

Ai:Ai-1 Di-1

Ai-1 Bi-1

Page 72: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 72

void b(int i) { if (i > 0) { c(i-1); y += incr; plot(x,y); b(i-1); x += incr; plot(x,y); b(i-1); y -= incr; plot(x,y); a(i-1); } }

Bi:Bi-1 Bi-1

Ci-1 Ai-1

Page 73: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 73

void c(int i) { if (i > 0) { b(i-1); x += incr; plot(x,y); c(i-1); y += incr; plot(x,y); c(i-1); x -= incr; plot(x,y); d(i-1); } }

Ci:Di-1 Ci-1

Bi-1 Ci-1

Page 74: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 74

void d(int i) { if (i > 0) { a(i-1); y -= incr; plot(x,y); d(i-1); x -= incr; plot(x,y); d(i-1); y += incr; plot(x,y); c(i-1); } }

Di:Ci-1 Ai-1

Di-1 Di-1

Page 75: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 75

Notes• The basis drawings A1, B1, C1, D1 are coded by calling a

(1), b(1), c(1), d(1)– the calls a(0), b(0), c(0), d(0) do nothing

• setplot(x,y)– sets the plotter coordinates to (x,y)

• plot(x,y)– draws a line from the current plotter coordinates to (x,y), and

updates the plotter coordinates

Page 76: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 76

5.3. Hilbert Curve URLs

• Java applets for generating fractals http://www.iit.edu/~krawczyk/java.html

– the Hilbert curve applet has a nice GUI

• The Shodor Education Foundationhttp://www.shodor.org/interactivate/activities/

– lots of maths-related applets

continued

Page 77: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 77

• Includes a Java applet in Peano.javahttp://monet.mercersburg.edu/henle/Peano/Peano.html

• Some discussion, and a Hilbert screen saverhttp://www.dcs.napier.ac.uk/~andrew/hilbert.html

Page 78: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 78

5.4. Some Fun Stuff

• Look at other fractal-based curves– e.g. Sierpinski curves, Koch curves

snowflakes, Levy dragons

Page 79: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 79

6. Proving Recursive Programs Work

• Proofs involving (recursive) functions usually say how input arguments affect the return value– e.g fact(i) --> i!

• Induction proofs usually involve the “size” of the argument, and how it changes as the function is recursively called.

Page 80: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 80

Different Kinds of Size

• Argument “size” can be things like:– the argument value. e.g. i in fact(i)– the length of a list passed as an argument– the number of nodes in a tree argument– etc.

Page 81: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 81

6.1. Proving fact()• A reminder of the code:

int fact(int n){ if (n <= 1) return 1; else return n * fact(n-1);}

• Inductive statement S(i):– when fact() is called with the value i for the argument n, f

act() returns i! when i >= 1

continued

Page 82: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 82

• Basis. For i=1, the first if-test results in a return value 1, which is 1!

• Induction. – Assume S(i) : fact(i) == i!– s(i+1): fact(i+1)

• returns (i+1) * fact(i) , which is:• (i+1) * i! , which is• (i+1)! , so the inductive step is true

Page 83: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 83

6.2. Proving convert()• A reminder of the code:

void convert(int i){ if (i > 0) { convert(i/2); putchar(‘0’ + i%2); }}

• Inductive statement S(k):– convert(k) produces the binary representation of integer

k >= 1– e.g. convert(6) == binary of 6 == 1102

e.g. 610 --> 1102

1310 --> 11012

continued

Page 84: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 84

• Basis. k == 1. The program executes:convert(0); // does nothingputchar('0'+ 1); // prints '1'

– this is the correct output– S(1) is true

• Induction. Assume S(k/2) and prove S(k) for k >= 2, when k is even, and when k is odd– show S(k/2) --> S(k) is true

Page 85: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 85

Graphically

iconvert

iconvert

iconvert

kconvert(i/2);putchar(i%2)

convert(i/2);putchar(i%2)

convert(i/2);putchar(i%2)

. . . .

Assume correct

k/2

Page 86: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 86

Inductive Cases• If k is even (e.g. 30), then output is:

– convert(k/2) then putchar(k%2) which is– “binary of k/2” 0 which is– 2 * “binary of k/2” which is– “binary of k” which is true

• If k == 30 then the output is:– convert(15) putchar(0) which is– “binary of 15” 0 which is– 2 * “binary of 15” which is

2 * 11112 == 111102

continued

Page 87: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 87

• If k is odd (e.g. 31), then output is:– convert(k/2) then putchar(k%2) which is– “binary of (k-1)/2” 1 which is– 2 * “binary of (k-1)/2” + 1 which is– “binary of k”

• If k == 31 then the output is:– convert(15) putchar(1) which is– “binary of 15” 1 which is– 2 * “binary of 15” + 1 which is– ( 2 * 11112 ) + 1 == 111112

Page 88: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 88

7. Further Information

• DM: section 3.4

• Algorithms + Data Structures = ProgramsNiklaus WirthPrentice-Hall, 1976, Chapter 3

Page 89: Discrete Maths 3. Recursion Objective

241-303 Discrete Maths: Recursion/3 89

“Drawing Hands” M.C. Escher, 1948