Top Banner
Solving Recurrence Lecture 19: Nov 25
30

Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Dec 31, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Recurrence

Lecture 19: Nov 25

Page 2: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Some Recursive Programming (Optional?)

Page 3: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Test

int hello(int n){

if (n==0)return 0;

elseprintf(“Hello World %d\n”,n);hello(n-1);

}

1. What would the program do if I call hello(10)?

2. What if I call hello(-1)?

3. What if the order of printf() and hello() is reversed?

Page 4: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Computing Sum of Arithmetic Progression

int AP(int n){

if (n==0)return 0;

elsereturn (n+AP(n-1));

}

Many programs can be written in a recursive way.

The way of thinking is different.

Always try to reduce it to smaller problems.

Page 5: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Computing Exponential Function

int EX(int n){

if (n==0)return 1;

elsereturn (EX(n-1)+EX(n-1));

}

How many function calls if I run EX(n)?

This function is to compute 2n.

2n times.

If we replace the last line by return 2EX(n-1),

then the program will compute the same thing,

but there will be only n function calls.

Page 6: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Post #1 Post #2 Post #3

Move1,2(n)::= Move1,3(n-1);

biggest disk 12;

Move3,2(n-1)

Tower of Hanoi

To move the biggest disk,we must first move the disks on top to another post.

Page 7: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Tower of Hanoi

T11(a,b)

{

T10(a,c);

printf(“Move Disk 11 from a to b\n”);

T10(c,b);

}

Suppose we already have a function T10(a,b) to move 10 disks from pole a to pole b.

It is then easy to write a program for T11(a,b)

In general you can write exactly the same program for Tn,

if we are given a program for Tn-1.

Instead of writing one program for each n,

we can take n as an input and write a recursive program.

Page 8: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Tower of Hanoi

Tower_of_Hanoi(int origin, int destination, int buffer, int number)

{

if (n==0)

return;

Tower_of_Hanoi(origin, buffer, destination, number-1);

printf(“Move Disk #%d from %d to %d\n”, number, origin, destination);

Tower_of_Hanoi(buffer, destination, origin, number-1);

}

This is the power of recursive thinking.

The program is very short,

yet it is not easy to write it without recursion

Page 9: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Tower of Hanoi

T(A,C,B,3)

Tower_of_Hanoi(origin, destination, buffer, number)

Move 3 from A to C.

T(A,B,C,2)

T(B,C,A,2)

move 2 from A to B

move 2 from B to C

T(A,C,B,1)

T(C,B,A,1)

T(B,A,C,1)

T(A,C,B,1)

move 1 from A to C

move 1 from C to B

move 1 from B to A

move 1 from A to C

1

2

3

4

5

6

7

Page 10: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Generate Strings

Can you write a program to generate all n-bit strings with k ones?

There are many ways to do it.

(1)Generate all n-bit strings and output those strings with k ones.

- Too slow

(2) Write k for-loops.

- That’s okay if k is known, but what if k is part of the input?

(3) Write a program to write a program with k for loops.

- That’s okay, but can we do it more elegantly?

(4) Write a recursive program for it.

Page 11: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Generate Strings

The idea of the recursive program is simple.

First we generate all strings which begin with 1,

and then generate all strings which begin with 0.

Can you write a program to generate all n-bit strings with k ones?

For strings which begin with 1, we still have n-1 bits and k-1 ones left.

For strings which begin with 0, we still have n-1 bits and k ones left.

Let’s say the program is called gen(n,k).

gen(n-1,k-1)

gen(n-1,k)Sounds familiar?

Page 12: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Generate Strings

Can you write a program to generate all N-bit strings with K ones?

int solution[N]; (an array holding an N-bit string, from solution[0] to solution[n-1])

gen(int n, int k) (n is # bits left, and k is # ones left){

if (n==0) (no more bits left)print solution; (write a for loop to print out the N-bits in solution)return;

if (k > 0)solution[N-n] = 1; (generate the strings beginning with one)gen(n-1,k-1);

if (n > k) (do it only if there are enough places for the ones)solution[N-n]=0; (generate the strings beginning with zero)gen(n-1,k);

}

Page 13: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Programming Exercises

Can you write a recursive program to generate all permutations of n elements?

Can you write a recursive program for merge-sort?

Page 14: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Recurrence

Page 15: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Warm Up

a0=1, ak = ak-1 + 2

a1 = a0 + 2

a2 = a1 + 2 = (a0 + 2) + 2 = a0 + 4

a3 = a2 + 2 = (a0 + 4) + 2 = a0 + 6

a4 = a3 + 2 = (a0 + 6) + 2 = a0 + 8

See the pattern is ak = a0 + 2k = 2k+1

You can verify by induction.

Page 16: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Hanoi Sequence

a1=1, ak = 2ak-1 + 1

a2 = 2a1 + 1 = 3

a3 = 2a2 + 1 = 2(2a1 + 1) + 1 = 4a1 + 3 = 7

a4 = 2a3 + 1 = 2(4a1 + 3) + 1 = 8a1 + 7 = 15

a5 = 2a4 + 1 = 2(8a1 + 7) + 1 = 16a1 + 15 = 31

a6 = 2a5 + 1 = 2(16a1 + 15) + 1 = 32a1 + 31 = 63

Guess the pattern is ak = 2k-1

You can verify by induction.

Page 17: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Merge Sort Recurrence

T2k = 2Tk + 2k

If we could guess that Tk is k log2k,

then we can prove that T2k is 2k log2(2k).

This is because T2k = 2Tk + 2k

= 2klog2k + 2k

= 2k(log2k + 1)

= 2k(log2k + log22)

= 2klog22k

Page 18: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Merge Sort Recurrence

T2k = 2Tk + 2k

How could we guess Tk = k log2k in the first place?

If there are n numbers there are log2n levels.

In each level i we need to solve 2i-1 merge problems.

Each merge problem in level i has two subseqences

of n/2i numbers, and so can be solved in n/2i-1

steps.

So each level requires a total of (2i-1)(n/2i-1)=n steps.

Since there are log2n levels,

the total number of steps is at most nlog2n.

Level 3

Level 1

Level 2

Page 19: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Fibonacci Sequence

a0=0, a1=1, ak = ak-1 + ak-2

a2 = a1 + a0 = 1

a3 = a2 + a1 = 2a1 + a0 = 2

a4 = a3 + a2 = 2a2 + a1 = 3a1 + 2a0 = 3

a5 = a4 + a3 = 2a3 + a2 = 3a2 + 2a1 = 5a1 + 3a0 = 5

a6 = a5 + a4 = 2a4 + a3 = 3a3 + 2a2 = 5a2 + 3a1 = 8a1 + 5a0 = 8

a7 = a6 + a5 = 2a5 + a4 = 3a4 + 2a3 = 5a3 + 3a2 = 8a2 + 5a1 = 13a1 + 8a0 = 13

See the pattern an = an-kak+1 + an-k-1ak

but this does not give a formula for computing an

Page 20: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Second Order Recurrence Relation

In the textbook it is called “second-order linear homogeneous recurrence

relation with constant coefficients”.

ak = Aak-1 + Bak-2

A and B are real numbers and B≠0

For example, Fibonacci sequence is when A=B=1.

To solve this equation, first we will find some solutions,

and later show that they “generate” all possible solutions.

Page 21: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Geometric-Sequence Solution

ak = Aak-1 + Bak-2

Find solutions of the form (1, t, t2, t3, t4, …, tn, …)

tk = Atk-1 + Btk-2

That is, suppose ak=tk

t2 = At + B

t2 - At – B = 0

So t is a root of the quadratic equation t2 - At – B = 0.

Page 22: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Example

ak = ak-1 + 2ak-2

Find solutions of the form (1, t, t2, t3, t4, …, tn, …)

So t must be a root of the quadratic equation t2 - t – 2 = 0.

This implies that t=2 or t=-1.

So solutions of the form (1, t, t2, t3, t4, …, tn, …) are:

(i) (1,2,4,8,16,32,64,…)

(ii) (1,-1,1,-1,1,-1,…)

Page 23: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Example

ak = ak-1 + 2ak-2

So solutions of the form (1, t, t2, t3, t4, …, tn, …) are:

(i) (1,2,4,8,16,32,64,…)

(ii) (1,-1,1,-1,1,-1,1,…)

Are there other solutions?

Try (2,1,5,7,17,31,65,…)

(0,3,3,9,15,33,63,…)

(4,5,13,23,49,95,193,…)

How to obtain these solutions?

Page 24: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Linear Combination of Two Solutions

If (r0,r1,r2,r3,…) and (s0,s1,s2,s3,…) are solutions to ak = Aak-1 + Bak-2,

then the sequence (a0,a1,a2,a3,…) defined by the formula

ak = Crk + Dsk

also satisfies the same recurrence relation for any C and D.

This says that any linear combination of two solutions for

the recurrence relation is also a solution for the recurrence.

(This is easy to check.)

Page 25: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Linear Combination of Two Solutions

Are there other solutions than ak = Crk + Dsk?

Any solution to ak = Aak-1 + Bak-2 is determined by the first two terms a0 and a1

Suppose we already have two solutions (r0,r1,r2,r3,…) and (s0,s1,s2,s3,…).

If (r0,r1) and (s0,s1) are linearly independent,

then any possible (a0,a1) is a linear combination of (r0,r1) and (s0,s1),

and thus any solution to the recurrence relation ak = Aak-1 + Bak-2

is a linear combination of (r0,r1,r2,r3,…) and (s0,s1,s2,s3,…).

Page 26: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Distinct-Roots Theorem

Suppose a sequence (a0,a1,a2,a3,…) satisfies a recurrence relation

ak = Aak-1 + Bak-2

If t2 - At – B = 0 has two distinct roots r and s,

then an = Crn + Dsn for some C and D.

If we are given a0 and a1, then C and D are uniquely determined.

The theorem says that all the solutions of the recurrence relation

are a linear combination of the two series (1,r,r2,r3,r4,…,rn,…)

and (1,s,s2,s3,s4,…,sn,…) defined by the distinct roots of t2 - At – B = 0,

because the two series are linearly independent.

Page 27: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Fibonacci Sequence

a0=0, a1=1, ak = ak-1 + ak-2

First solve the quadratic equation t2 - t – 1 = 0.

So the distinct roots are:

Page 28: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving Fibonacci Sequence

a0=0, a1=1, ak = ak-1 + ak-2

By the distinct-roots theorem, the solutions satisfy the formula:

To figure out C and D, we substitute the value of a0 and a1:

Page 29: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Solving these two equations, we get:

Therefore:

Solving Fibonacci Sequence

Page 30: Solving Recurrence Lecture 19: Nov 25. Some Recursive Programming (Optional?)

Quick Summary

Recursion is a very useful and powerful technique in computer science.

It is very important to learn to think recursively,

by reducing the problem into smaller problems.

This is a necessary skill to acquire to become a professional programmer.

Make sure you have more practices in setting up recurrence relations.