data structures and algorithms

35
Data Structures and Algorithms Lecture (Recursion) Instructor: Quratulain

Upload: paley

Post on 05-Jan-2016

44 views

Category:

Documents


0 download

DESCRIPTION

Data Structures and Algorithms. Lecture (Recursion) Instructor: Quratulain. Outline. A definition of recursion How recursion works How recursion helps simplify some hard problem. Introduction to Recursion. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Data Structures and Algorithms

Data Structures and Algorithms

Lecture (Recursion)

Instructor: Quratulain

Page 2: Data Structures and Algorithms

OutlineA definition of recursion How recursion works How recursion helps simplify

some hard problem

Page 3: Data Structures and Algorithms

Introduction to RecursionLooping being one of the

cornerstones of programming it is in fact possible to create programs without an explicit loop construct.

Some languages, such as Scheme, do not in fact have an explicit loop construct like For, While, etc. Instead they use a technique known as recursion .

This turns out to be a very powerful technique for some types of problem

Page 4: Data Structures and Algorithms

DefinitionRecursion simply means applying

a function as a part of the definition of that same function.

The key to making this work is ◦ there must be a terminating condition

Page 5: Data Structures and Algorithms

ExampleThe mathematical factorial function is

defined as◦ the product of all the numbers up to and

including the argument, and the factorial of 1 is 1.

The factorial of N is equal to N times the factorial of (N-1). 1! = 12! = 1 x 2 = 23! = 1 x 2 x 3 = 2! x 3 = 6N! = 1 x 2 x 3 x .... (N-2) x (N-1) x N = (N-1)! x N

Page 6: Data Structures and Algorithms

PseudocodeInteger factorial(n) if n == 1 return 1 ……(base case) else return n * factorial(n-1) …….

(recursive case)

There is a small bug in this definition however, if you try to call it with a number less than 1 it goes into an infinite loop!

To fix that change the test to use "<=" instead of "==".

This goes to show how easy it is to make mistakes with terminating conditions, this is probably the single most common cause of bugs in recursive functions.

Page 7: Data Structures and Algorithms

Recursive steps in factorial function

Let's see how that works when we execute it.

we get: factorial(4) = 4 * factorial(3)factorial(3) = 3 * factorial(2)factorial(2) = 2 * factorial(1) factorial(1) = 1

Page 8: Data Structures and Algorithms

RecursionWriting the factorial function without

recursion actually isn't that difficult However as we'll see some functions

are much harder to write without recursion.

Functional Programming tries to focus on the what rather than the how of problem solving. That is, a functional program should describe the problem to be solved rather than focus on the mechanism of solution.

Page 9: Data Structures and Algorithms

RecursionFor some types of problem it is a

natural and powerful technique. Unfortunately for many other

problems it requires a fairly abstract thinking style, heavily influenced by mathematical principles.

The resultant code is often far from readable to the layman programmer.

The resultant code is also very often much shorter than the equivalent imperative code and more reliable.

Page 10: Data Structures and Algorithms

Applications Permutation means a combination of

certain units in all possible orderings. Recursion can be effectively used to

find all possible combinations of a given set of elements. This has applications in anagrams, scheduling and, of course, Magic Squares.

And if you're interested, Recursion can also be used for cracking passwords.

Polynomial arithmeticsStorage management

Page 11: Data Structures and Algorithms

what is a magic square? A magic square is a 'matrix' or a 2-

dimensional grid of numbers. Take the simple case of a 3x3 magic square.

A Magic Square contains a certain bunch of numbers, in this case, 1..9, each of which has to be filled once into the grid. The 'magic' property of a Magic Square is that the sum of the numbers in the rows and columns and diagonals should all be same, in this case, 15.

3x3 magic square , what about 5X5 and more 8 1 6

3 5 7

4 9 2

Page 12: Data Structures and Algorithms

Concept of magic squarehow do we accomplish permuting

a set of numbers (or objects) using recursion? For simplicity sake, we work with a 1-dimensional array. In the case of a 3x3 square, let's have a 9-length single-dimensional array. So we have numbers 1 to 9 and 9 locations to put them into.

Page 13: Data Structures and Algorithms

As a preliminary exercise, try to program the following sequence...

111,112,113,121,122,123,131,132,133, 211,212,213,221,222,223,231,232,233, 311,312,313,321,322,323,331,332,333. ...using For loops.

Hint: for loop 1 to 3, in each iteration first two terms are same.

Page 14: Data Structures and Algorithms

Answer: It's as simple as:- for i = 1 to 3 for j = 1 to 3 for k = 1 to 3 print i,j,k Now, try it using recursion.

Page 15: Data Structures and Algorithms

Answer: Think of it this way: i loops from 1 to 3. For every value of i, j loops from 1 to 3. For every value of j, k loops from 1 to 3. For every value of k, the values are displayed. So, basically, these three loops perform very similar functions, which can therefore be reduced to a single recursive function with a single loop. void Func(n) { for i = 1 to 3 { A[n] = i if (n<3) Func(n+1) else print A[1],A[2],A[3] } }

Page 16: Data Structures and Algorithms

Homework Write a recursive function that

has one parameter which is a size_t value called x. The function prints x asterisks, followed by x exclamation points. Do NOT use any loops. Do NOT use any variables other than x.

Page 17: Data Structures and Algorithms

HomeworkLet us consider the problem of

computing the kth Fibonacci number. A series contain addition of two

previous numbers. 0, 1, 1, 2, 3, 5, 8,13,...

The Fibonacci numbers are recursively defined as follows:

Base cases: F(0) = 0, F(1) = 1Recursive call: Fi = Fi−1 + Fi−2Develop java program for k numbers

series and manually trace each step to understand the internal working.

Page 18: Data Structures and Algorithms

To have an analogy, suppose you are given two identical photos.

It would take you just a glance of the eye to agree that they're same.

The computer, on the other hand, would compare them dot by dot, pixel by pixel, and then agree that they're same.

In the process, both you and the computer accomplish the same task in pretty much the same time, but in very different ways.

Page 19: Data Structures and Algorithms

Tower of Hanoi In the great temple at Benares beneath the

dome which marks the center of the world, rests a brass plate in which are fixed three diamond needles, each a cubit high and as thick as the body of a bee. On one of these needles, at the creation, God placed sixty-four disks of pure gold, the largest disk resting on the brass plate and the others getting smaller and smaller up to the top one. This is the Tower of Brahma. Day and Night unceasingly, the priests transfer the disks from one diamond needle to another according to the fixed and immutable laws of Brahma, which require that the priest on duty must not move more than one disk at a time and that he must place this disk on a needle so that there is no smaller disk below it. When all the sixty-four disks shall have been thus transferred from the needle on which at the creation God placed them to one of the other needles, tower, temple and Brahmins alike will crumble into dust, and with a thunderclap the world will vanish.

Page 20: Data Structures and Algorithms

ExampleSuppose the problem is to move the stack of

six disks from needle 1 to needle 2. Part of the solution will be to move the

bottom disk from needle 1 to needle 2, as a single move.

Before we can do that, we need to move the five disks on top of it out of the way.

After we have moved the large disk, we then need to move the five disks back on top of it to complete the solution.

Page 21: Data Structures and Algorithms

process

Move the top five disks to stack 3

Page 22: Data Structures and Algorithms

process Move the disk on stack 1 to stack

2

Page 23: Data Structures and Algorithms

process

Move the disks on stack 3 to stack 2

Page 24: Data Structures and Algorithms

Recursive solution

1. If n==1 move the single disk from A to C and stop

2. Move the top n-1 disks from A to B using C as auxiliary

3. Move the remaining disk from A to C

4. Move the n-1 disks from B to C using A as auxiliary

Page 25: Data Structures and Algorithms

Pseudo-codeCall tower (n, ‘A’, ‘C’, ‘B’);Function Tower (int n, char frompeg, char

topeg, char auxpeg){

If (n==1){ print(“from “+frompeg+” +”to “+ topeg) return}

Tower(n-1, frompeg, auxpeg, topeg) print(“from “+frompeg+” +”to “+ topeg)Tower (n-1,auxpeg,topeg,frompeg)}

Page 26: Data Structures and Algorithms

Recursive functionEach time a recursive function

calls itself, an entirely new data area for that particular call must be allocated. This data area contains all parameters, local variables, temporaries, and a return address.

Each return causes the current data area to be freed.

Page 27: Data Structures and Algorithms

Recursion Versus IterationThere are similarities between

recursion and iterationIn iteration, a loop repetition condition

determines whether to repeat the loop body or exit from the loop

In recursion, the condition usually tests for a base case

You can always write an iterative solution to a problem that is solvable by recursion

Recursive code may be simpler than an iterative algorithm and thus easier to write, read, and debug

Page 28: Data Structures and Algorithms

Efficiency of RecursionRecursive methods often have slower

execution times when compared to their iterative counterparts

The overhead for loop repetition is smaller than the overhead for a method call and return

If it is easier to conceptualize an algorithm using recursion, then you should code it as a recursive method◦ The reduction in efficiency does not

outweigh the advantage of readable code that is easy to debug

Page 29: Data Structures and Algorithms

Recursive Array Search

Searching an array can be accomplished using recursion

Simplest way to search is a linear search◦Examine one element at a time starting

with the first element and ending with the last

Base case for recursive search is an empty array◦Result is negative one

Another base case would be when the array element being examined matches the target

Recursive step is to search the rest of the array, excluding the element just examined

Page 30: Data Structures and Algorithms

Recursive Data StructuresComputer scientists often encounter

data structures that are defined recursively◦Trees are defined recursively

Linked list can be described as a recursive data structure

Recursive methods provide a very natural mechanism for processing recursive data structures

The first language developed for artificial intelligence research was a recursive language called LISP

Page 31: Data Structures and Algorithms

Recursive Definition of a Linked ListA non-empty linked list is a

collection of nodes such that each node references another linked list consisting of the nodes that follow it in the list

The last node references an empty list

A linked list is empty, or it contains a node, called the list head, that stores data and a reference to a linked list

Page 32: Data Structures and Algorithms

BacktrackingBacktracking is an approach to

implementing systematic trial and error in a search for a solution◦ An example is finding a path through a

mazeIf you are attempting to walk through

a maze, you will probably walk down a path as far as you can go

Eventually, you will reach your destination or you won’t be able to go any farther

If you can’t go any farther, you will need to retrace your steps

Backtracking is a systematic approach to trying alternative paths and eliminating them if they don’t work

Page 33: Data Structures and Algorithms

Backtracking (continued)Never try the exact same path more

than once, and you will eventually find a solution path if one exists

Problems that are solved by backtracking can be described as a set of choices made by some method

Recursion allows us to implement backtracking in a relatively straightforward manner◦Each activation frame is used to

remember the choice that was made at that particular decision point

A program that plays chess may involve some kind of backtracking algorithm

Page 34: Data Structures and Algorithms

Recursion typesLinear recursionBinary recursion (e.g tower of

Hanoii)Multiple recursion

Page 35: Data Structures and Algorithms

Sample questionsWhy would you use other logic when you can

write recursive a function?Ans.1. Recursion will be bad for code readability -

not every programmer can understand it. (if non-recursive is complex)

2. Recursion is a repeated method call stack - the more you use recursion the more memory stack created.

3. It is hard to debug the code.