Data Structures Using C 2 E Chapter 6

  • Slides: 54
Download presentation
Data Structures Using C++ 2 E Chapter 6 Recursion Edited by Malak Abdullah Jordan

Data Structures Using C++ 2 E Chapter 6 Recursion Edited by Malak Abdullah Jordan University of Science and Technology

Objectives • Learn about recursive definitions • Explore the base case and the general

Objectives • Learn about recursive definitions • Explore the base case and the general case of a recursive definition • Learn about recursive algorithm • Learn about recursive functions • Explore how to use recursive functions to implement recursive 2

Recursive Definitions • Recursion – Process of solving a problem by reducing it to

Recursive Definitions • Recursion – Process of solving a problem by reducing it to smaller versions of itself • 5! • Example: factorial problem – 5! • 5 x 4 x 3 x 2 x 1 =120 – If n is a nonnegative • • 5 * 4! 5 * 4 * 3 * 2! 5 * 4 * 3 * 2 * 1 = 120 • Factorial of n (n!) defined as follows: Data Structures Using C++ 2 E 3

Recursive Definitions (cont’d. ) • Direct solution (Equation 6 -1) – Right side of

Recursive Definitions (cont’d. ) • Direct solution (Equation 6 -1) – Right side of the equation contains no factorial notation • Recursive definition – A definition in which something is defined in terms of a smaller version of itself • Base case (Equation 6 -1) – Case for which the solution is obtained directly • General case (Equation 6 -2) – Case for which the solution is obtained indirectly using recursion 4

Recursive Definitions (cont’d. ) • Recursion insight gained from factorial problem – Every recursive

Recursive Definitions (cont’d. ) • Recursion insight gained from factorial problem – Every recursive definition must have one (or more) base cases – General case must eventually reduce to a base case – Base case stops recursion • Recursive algorithm – Finds problem solution by reducing problem to smaller versions of itself • Recursive function – Function that calls itself Data Structures Using C++ 2 E 5

Fun 1(3) Print 3 Call fun 2(2). . . Print * Fun 2(2) Print

Fun 1(3) Print 3 Call fun 2(2). . . Print * Fun 2(2) Print 2 Call fun 3(1). . . Print & Fun 3(1) Print 1 Print $

Fun(3) Print 3 Call fun(2). . . Print a= 3 Fun(2) Print 2 Call

Fun(3) Print 3 Call fun(2). . . Print a= 3 Fun(2) Print 2 Call fun(1). . . Print a= 2 Fun(1) Print 1 Call fun(0). . . Print a= 1 Fun(0) Print a= 0

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) void main(

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) void main( ) { cout<< fact (5)<<endl; } 5 * Fact 1(4) 4 * Fact 1(3) 3 * Fact 1(2) 2 * Fact 1(1) 1 * Fact 1(0) 1

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) 120 void

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) 120 void main( ) { cout<< fact (5)<<endl; } 5 * Fact 1(4) 24 4 * Fact 1(3) 6 2 Fact 1(2) 3 * 2 * Fact 1(1) 1 1 * Fact 1(0) 1 1

Recursive Definitions (cont’d. ) • Recursive function implementing the factorial function FIGURE 6 -1

Recursive Definitions (cont’d. ) • Recursive function implementing the factorial function FIGURE 6 -1 Execution of fact(4) 10

Recursive Definitions (cont’d. ) • Recursive function notable comments – Recursive function has unlimited

Recursive Definitions (cont’d. ) • Recursive function notable comments – Recursive function has unlimited number of copies of itself (logically) – Every call to a recursive function has its own • Code, set of parameters, local variables – After completing a particular recursive call • Control goes back to calling environment (previous call) • Current (recursive) call must execute completely before control goes back to the previous call • Execution in previous call begins from point immediately following the recursive call Data Structures Using C++ 2 E 11

Recursive Definitions (cont’d. ) • Direct and indirect recursion – Directly recursive function •

Recursive Definitions (cont’d. ) • Direct and indirect recursion – Directly recursive function • Calls itself – Indirectly recursive function • Calls another function, eventually results in original function call • Requires same analysis as direct recursion • Base cases must be identified, appropriate solutions to them provided • Tracing can be tedious – Tail recursive function • Last statement executed: the recursive call Data Structures Using C++ 2 E 12

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) 5 Fact

5!= 5 * ( 4 *( 3* (2 * (1)))) Fact 1(5) 5 Fact 1(4) 4 Fact 1(3) 3 Fact 1(2) 2 Fact 1(1) 1 Fact 1(0) 1

5!= ((((1) * 2) * 3) * 4) * 5 Fact 2(5) 5 Fact

5!= ((((1) * 2) * 3) * 4) * 5 Fact 2(5) 5 Fact 2(4) 4 Fact 2(3) 3 Fact 2(2) 2 Fact 2(1) 1 Fact 2(0) 1

Indirectly Recursive Infinite Recursion

Indirectly Recursive Infinite Recursion

Recursive Definitions (cont’d. ) • Infinite recursion – Occurs if every recursive call results

Recursive Definitions (cont’d. ) • Infinite recursion – Occurs if every recursive call results in another recursive call – Executes forever (in theory) – Call requirements for recursive functions • System memory for local variables and formal parameters • Saving information for transfer back to right caller – Finite system memory leads to • Execution until system runs out of memory • Abnormal termination of infinite recursive function Data Structures Using C++ 2 E 16

Recursive Definitions (cont’d. ) • Requirements to design a recursive function – Understand problem

Recursive Definitions (cont’d. ) • Requirements to design a recursive function – Understand problem requirements – Determine limiting conditions – Identify base cases, providing direct solution to each base case – Identify general cases, providing solution to each general case in terms of smaller versions of itself Data Structures Using C++ 2 E 17

Fibonacci Number • Sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34. .

Fibonacci Number • Sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34. . . • Given first two numbers (a 1 and a 2) – nth number an, n >= 3, of sequence given by: an = an 1 + an-2 • Recursive function: r. Fib. Num – Determines desired Fibonacci number – Parameters: three numbers representing first two numbers of the Fibonacci sequence and a number n, the desired nth Fibonacci number – Returns the nth Fibonacci number in the sequence Data Structures Using C++ 2 E 18

Fibonacci Number (cont’d. ) • Third Fibonacci number – Sum of first two Fibonacci

Fibonacci Number (cont’d. ) • Third Fibonacci number – Sum of first two Fibonacci numbers • Fourth Fibonacci number in a sequence – Sum of second and third Fibonacci numbers • Calculating fourth Fibonacci number – Add second Fibonacci number and third Fibonacci number Data Structures Using C++ 2 E 19

If x= 1 then Fib(x)= 1 If x= 2 then Fib(x)=2 Otherwise Fib(x)= Fib(x-1)

If x= 1 then Fib(x)= 1 If x= 2 then Fib(x)=2 Otherwise Fib(x)= Fib(x-1) + Fib(x-2) • Fib(3)= Fib(2) + Fib(1) = 3 • Fib(4)= Fib(3) + Fib(2) = 5 • Fib(5)= Fib(4) + Fib(3) = 8 • And so on. . . • Fib(10) =. . .

Fibonacci Number (cont’d. ) • Recursive algorithm – Calculates nth Fibonacci number • a

Fibonacci Number (cont’d. ) • Recursive algorithm – Calculates nth Fibonacci number • a denotes first Fibonacci number • b denotes second Fibonacci number • n denotes nth Fibonacci number Data Structures Using C++ 2 E 21

Fibonacci Number (cont’d. ) • Recursive function implementing algorithm • Trace code execution •

Fibonacci Number (cont’d. ) • Recursive function implementing algorithm • Trace code execution • Review code on page 368 illustrating the function r. Fib. Num Data Structures Using C++ 2 E 22

Fibonacci(1)= 2 , Fibonacci(2)= 3 Fibonacci(5)=? ? r. Fib. Num(2, 3, 5) 8 13

Fibonacci(1)= 2 , Fibonacci(2)= 3 Fibonacci(5)=? ? r. Fib. Num(2, 3, 5) 8 13 5 r. Fib. Num(2, 3, 4) + r. Fib. Num(2, 3, 3) 5 + r. Fib. Num(2, 3, 3) r. Fib. Num(2, 3, 2) + r. Fib. Num(2, 3, 1) 3 2 3 r. Fib. Num(2, 3, 2) + r. Fib. Num(2, 3, 1) 3 2

Another example Fib(4) Fib(3) Fib(2) Fib(1) 1 Fib(2) Fib(1) Fib(0) 0 1 Fib(1) 1

Another example Fib(4) Fib(3) Fib(2) Fib(1) 1 Fib(2) Fib(1) Fib(0) 0 1 Fib(1) 1 Fib(0) 0

Fibonacci Number (cont’d. ) FIGURE 6 -7 Execution of r. Fib. Num(2, 3, 4)

Fibonacci Number (cont’d. ) FIGURE 6 -7 Execution of r. Fib. Num(2, 3, 4) Data Structures Using C++ 2 E 25

Print the number in reverse 1357 7531 Reverse(1357) Print 1357 % 10 7 Call

Print the number in reverse 1357 7531 Reverse(1357) Print 1357 % 10 7 Call reverse(135) Reverse(135) Print 135 % 10 5 Call reverse(13) Reverse(13) Print 13 % 10 3 Call reverse(1) Reverse(1) Print 1

Print a Linked List in Reverse Order • Function reverse. Print – Given list

Print a Linked List in Reverse Order • Function reverse. Print – Given list pointer, prints list elements in reverse order • Figure 6 -5 example – Links in one direction – Cannot traverse backward starting from last node FIGURE 6 -5 Linked list Data Structures Using C++ 2 E 27

Print a Linked List in Reverse Order (cont’d. ) • Cannot print first node

Print a Linked List in Reverse Order (cont’d. ) • Cannot print first node info until remainder of list printed • Cannot print second node info until tail of second node printed, etc. • Every time tail of a node considered – List size reduced by one – Eventually list size reduced to zero – Recursion stops Data Structures Using C++ 2 E 28

Print a Linked List in Reverse Order (cont’d. ) • Recursive algorithm in pseudocode

Print a Linked List in Reverse Order (cont’d. ) • Recursive algorithm in pseudocode • Recursive algorithm in C++ Data Structures Using C++ 2 E 29

reverse. Print(node. Type * current ) Current 4 { while(current != NULL) { reverse.

reverse. Print(node. Type * current ) Current 4 { while(current != NULL) { reverse. Print(current link) Current cout<< current info; } } 8 Current 9 NULL 4 8 9 current stack. Top 9 8 4 current

Print a Linked List in Reverse Order (cont’d. ) • Function template to implement

Print a Linked List in Reverse Order (cont’d. ) • Function template to implement previous algorithm and then apply it to a list Data Structures Using C++ 2 E 31

Print a Linked List in Reverse Order (cont’d. ) FIGURE 6 -6 Execution of

Print a Linked List in Reverse Order (cont’d. ) FIGURE 6 -6 Execution of the statement reverse. Print(first); Data Structures Using C++ 2 E 32

Print a Linked List in Reverse Order (cont’d. ) • The function print. List.

Print a Linked List in Reverse Order (cont’d. ) • The function print. List. Reverse – Prints an ordered linked list contained in an object of the type linked. List. Type Data Structures Using C++ 2 E 33

Recursion or Iteration? • Dependent upon nature of the solution and efficiency • Efficiency

Recursion or Iteration? • Dependent upon nature of the solution and efficiency • Efficiency – Overhead of recursive function: execution time and memory usage • Given speed memory of today’s computers, we can depend more on how programmer envisions solution – Use of programmer’s time – Any program that can be written recursively can also be written iteratively Data Structures Using C++ 2 E 34

More Examples 35

More Examples 35

Largest Element in an Array FIGURE 6 -2 list with six elements • list:

Largest Element in an Array FIGURE 6 -2 list with six elements • list: array name containing elements • list[a]. . . list[b] stands for the array elements list[a], list[a + 1], . . . , list[b] • list length =1 – One element (largest) • list length >1 maximum(list[a], largest(list[a + 1]. . . list[b])) Data Structures Using C++ 2 E 36

5 3 6 2 5 4 3 6 2 4 6 2 3 4

5 3 6 2 5 4 3 6 2 4 6 2 3 4 2 6 2 4 4

5 3 6 2 5 4 3 6 2 4 6 2 3 6

5 3 6 2 5 4 3 6 2 4 6 2 3 6 4 4

5 3 6 2 5 4 3 6 2 3 4 6

5 3 6 2 5 4 3 6 2 3 4 6

5 3 6 2 5 6 4

5 3 6 2 5 6 4

Max is 6

Max is 6

Largest(arr, 0, 3) 3 , 6, 2, 5 Max = 6 3 > Max

Largest(arr, 0, 3) 3 , 6, 2, 5 Max = 6 3 > Max ? ? ? Largest(arr, 1, 3) 6 , 2, 5 Max = 5 6 > Max ? ? ? 0 3 Largest(arr, 2, 3) 1 2 3 6 2 5 2, 5 Max = 5 2 > Max ? ? ? Largest(arr, 3, 3) 5

Largest Element in an Array (cont’d. ) • maximum(list[0], largest(list[1]. . . list[5])) •

Largest Element in an Array (cont’d. ) • maximum(list[0], largest(list[1]. . . list[5])) • maximum(list[1], largest(list[2]. . . list[5]), etc. • Every time previous formula used to find largest element in a sublist – Length of sublist in next call reduced by one Data Structures Using C++ 2 E 43

Largest Element in an Array (cont’d. ) • Recursive algorithm in pseudocode Data Structures

Largest Element in an Array (cont’d. ) • Recursive algorithm in pseudocode Data Structures Using C++ 2 E 44

Largest Element in an Array (cont’d. ) • Recursive algorithm as a C++ function

Largest Element in an Array (cont’d. ) • Recursive algorithm as a C++ function Data Structures Using C++ 2 E 45

Largest Element in an Array (cont’d. ) FIGURE 6 -3 list with four elements

Largest Element in an Array (cont’d. ) FIGURE 6 -3 list with four elements • Trace execution of the following statement cout << largest(list, 0, 3) << endl; • Review C++ program on page 362 – Determines largest element in a list Data Structures Using C++ 2 E 46

Largest Element in an Array (cont’d. ) FIGURE 6 -4 Execution of largest(list, 0,

Largest Element in an Array (cont’d. ) FIGURE 6 -4 Execution of largest(list, 0, 3) Data Structures Using C++ 2 E 47

Tower of Hanoi • Object – Move 64 disks from first needle to third

Tower of Hanoi • Object – Move 64 disks from first needle to third needle • Rules – Only one disk can be moved at a time – Removed disk must be placed on one of the needles – A larger disk cannot be placed on top of a smaller disk FIGURE 6 -8 Tower of Hanoi problem with three disks Data Structures Using C++ 2 E 48

Tower of Hanoi (cont’d. ) • Case: first needle contains only one disk –

Tower of Hanoi (cont’d. ) • Case: first needle contains only one disk – Move disk directly from needle 1 to needle 3 • Case: first needle contains only two disks – Move first disk from needle 1 to needle 2 – Move second disk from needle 1 to needle 3 – Move first disk from needle 2 to needle 3 • Case: first needle contains three disks Data Structures Using C++ 2 E 49

Tower of Hanoi (cont’d. ) FIGURE 6 -9 Solution to Tower of Hanoi problem

Tower of Hanoi (cont’d. ) FIGURE 6 -9 Solution to Tower of Hanoi problem with three disks Data Structures Using C++ 2 E 50

Tower of Hanoi (cont’d. ) • Generalize problem to the case of 64 disks

Tower of Hanoi (cont’d. ) • Generalize problem to the case of 64 disks – Recursive algorithm in pseudocode Data Structures Using C++ 2 E 51

Tower of Hanoi (cont’d. ) • Generalize problem to the case of 64 disks

Tower of Hanoi (cont’d. ) • Generalize problem to the case of 64 disks – Recursive algorithm in C++ Data Structures Using C++ 2 E 52

Tower of Hanoi (cont’d. ) • Analysis of Tower of Hanoi – Time necessary

Tower of Hanoi (cont’d. ) • Analysis of Tower of Hanoi – Time necessary to move all 64 disks from needle 1 to needle 3 – Manually: roughly 5 x 1011 years • Universe is about 15 billion years old (1. 5 x 1010) – Computer: 500 years • To generate 264 moves at the rate of 1 billion moves per second Data Structures Using C++ 2 E 53

Summary • Recursion – Solve problem by reducing it to smaller versions of itself

Summary • Recursion – Solve problem by reducing it to smaller versions of itself • Recursive algorithms implemented using recursive functions – Direct, indirect, and infinite recursion • Many problems solved using recursive algorithms • Choosing between recursion and iteration – Nature of solution; efficiency requirements • Backtracking – Problem solving; iterative design technique Data Structures Using C++ 2 E 54