21
Chapter 17 Recursion ( 递 递) §17.1 Introduction §17.2 Methodology of Recursion Design §17.3 Recursion vs. Iteration

Chapter 17 Recursion ( 递归 )

Embed Size (px)

DESCRIPTION

Chapter 17 Recursion ( 递归 ). §17.1 Introduction §17.2 Methodology of Recursion Design §17.3 Recursion vs. Iteration. §17.1 Introduction. Computing Factorial ( 阶乘 ). Factorial in mathematics: f(n) = n! = 1*2*..*n 1 if n=0 = n*(n-1)! if n>0. - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 17 Recursion ( 递归 )

Chapter 17 Recursion (递归 )

§17.1 Introduction

§17.2 Methodology of Recursion Design

§17.3 Recursion vs. Iteration

Page 2: Chapter 17 Recursion ( 递归 )

2

§17.1 Introduction

Computing Factorial (阶乘 )

Factorial in mathematics:

f(n) = n!

= 1*2*..*n

1 if n=0

=

n*(n-1)! if n>0

Factorial in C++

int factorial(int n){

int result;

if (n==0)

result =1;

else

result = n * factorial(n-1);

return result;

}Recursive Call!Recursive Call!

Page 3: Chapter 17 Recursion ( 递归 )

3

Computing Factorial

factorial(3) =

= 3 * factorial(2)

= 3 * (2 * factorial(1))

= 3 * ( 2 * (1 * factorial(0)))

= 3 * ( 2 * ( 1 * 1)))

= 3 * ( 2 * 1)

= 3 * 2

= 6

factorial(0) = 1;

factorial(n) = n*factorial(n-1);

Page 4: Chapter 17 Recursion ( 递归 )

4

Trace Recursive Factorial

factorial(4)factorial(4)

4*factorial(3)4*factorial(3)

2*factorial(1)2*factorial(1)

3*factorial(2)3*factorial(2)

1*factorial(0)1*factorial(0)

Step 9: return 24Step 9: return 24

Step 8: return 6Step 8: return 6

Step 7: return 2Step 7: return 2

Step 6: return 1Step 6: return 1

Step 5: return 1Step 5: return 1Step 4: execute factorial(0)Step 4: execute factorial(0)

Step 3: execute factorial(1)Step 3: execute factorial(1)

Step 2: execute factorial(2)Step 2: execute factorial(2)

Step 1: execute factorial(3)Step 1: execute factorial(3)

Step 0: execute factorial(4)Step 0: execute factorial(4)

return 1return 1

return 24 to callerreturn 24 to caller

Space Required

for factorial(3)

Space Required

for factorial(2)

Space Required

for factorial(1)

Space Required

for factorial(0)

Space Required

for factorial(4)

Page 5: Chapter 17 Recursion ( 递归 )

5

Recursive Function

Recursive Function A function with recursive call

Recursive call A function calls itself, directly or indirectly

f( ){ …… f( ); ……}

f( ){ …… f( ); ……}

f1( ){ f2( ){ …… …… f2( ); f1( ); …… …… } }

f1( ){ f2( ){ …… …… f2( ); f1( ); …… …… } }

Page 6: Chapter 17 Recursion ( 递归 )

6

Fibonacci Numbers

Finonacci series: 0 1 1 2 3 5 8 13 21 34 55 89 …

indices: 0 1 2 3 4 5 6 7 8 9 10 11 …

fib(3) = fib(2) + fib(1)

= (fib(1) + fib(0)) + fib(1)

= (1 + 0) +fib(1)

= 1 + fib(1)

= 1 + 1

= 2

ComputeFibonacciComputeFibonacci

0, if i = 0fib(i) = 1, if i = 1 fib(i -1) + fib(i -2), if i >=2

0, if i = 0fib(i) = 1, if i = 1 fib(i -1) + fib(i -2), if i >=2

Page 7: Chapter 17 Recursion ( 递归 )

7

return fib(3) + fib(2)

return fib(2) + fib(1)

return fib(1) + fib(0)

return 1

return fib(1) + fib(0)

return 0

return 1

return 1 return 0

1: call fib(3)

2: call fib(2)

3: call fib(1)

4: return fib(1)

7: return fib(2)

5: call fib(0)

6: return fib(0)

8: call fib(1)

9: return fib(1)

10: return fib(3) 11: call fib(2)

16: return fib(2)

12: call fib(1) 13: return fib(1) 14: return fib(0)

15: return fib(0)

fib(4) 0: call fib(4) 17: return fib(4)

Fibonacci Numbers

Page 8: Chapter 17 Recursion ( 递归 )

8

§17.2 Methodology of Recursion Design

Characteristics of Recursion

Different cases using selection statement

One or more base cases (the simplest case) To stop recursion

Every recursive call reduces the original problem To bring it increasingly closer to and eventually to be the base

case

Page 9: Chapter 17 Recursion ( 递归 )

9

Problem Solving Using Recursion

General – thinking recursively Divide and conquer Sub-problems resemble the original

void nPrintln(string msg, int times) {

if (times >= 1) {

cout << msg << endl;

nPrintln(msg, times - 1);

}

} bool isPalindrome(const string s) {

if (strlen(s) <= 1) return true;

else if (s[0] != s[strlen(s) - 1]) return false;

else

return isPalindrome(substring(s, 1, strlen(s) - 2));

}

Page 10: Chapter 17 Recursion ( 递归 )

10

Recursive Helper Function

Recursive helper function A recursive function with additional parameters to

reduce the problem Especially useful for functions involving strings/arrays

bool isPalindrome(const char * const s, int low, int high) {

if (high <= low) return true;

else if (s[low] != s[high]) return false;

else return isPalindrome(s, low + 1, high - 1);

}

bool isPalindrome(const char * const s) {

return isPalindrome(s, 0, strlen(s) - 1);

}

Page 11: Chapter 17 Recursion ( 递归 )

11

Case Studies

Recursive Selection Sort Find the largest number in the list and swaps it with

the last number. Ignore the last number and sort the remaining smaller

list recursively.

RecursiveSelectionSortRecursiveSelectionSort

Page 12: Chapter 17 Recursion ( 递归 )

12

Recursive Binary Search

If the key is less than the middle element, recursively search the key in the first half of the array.

If the key is equal to the middle element, the search ends with a match.

If the key is greater than the middle element, recursively search the key in the second half of the array.

RecursiveBinarySearchRecursiveBinarySearch

Page 13: Chapter 17 Recursion ( 递归 )

13

Towers of Hanoi

There are n disks labeled 1, 2, 3, . . ., n, and three towers labeled A, B, and C.

No disk can be on top of a smaller disk at any time.

All the disks are initially placed on tower A. Only one disk can be moved at a time, and it must

be the top disk on the tower.

Page 14: Chapter 17 Recursion ( 递归 )

14

Solution to Towers of Hanoi

A B Original position

C

A B Step 1: Move the first n-1 disks from A

to C recursively

C

A B Step2: Move disk n from A

to C

C

A B Step3: Move n-1 disks from

C to B recursively

C

. . .

n-1 disks

. . .

n-1 disks

. . .

n-1 disks

. . .

n-1 disks

Decompose the problem into three subproblems.

n n-1 n-2 … 1, move it directly!

Page 15: Chapter 17 Recursion ( 递归 )

15

Towers of Hanoi

TowersOfHanoiTowersOfHanoi1. 把 n-1个盘从 A搬到 C,借助 B2. 把 A上剩下的最大的一个盘搬到B3. 再把 n-1个盘从 C搬到 B,借助 A4. 当 n==1时,直接从 A搬到 B即可

1. 把 n-1个盘从 A搬到 C,借助 B2. 把 A上剩下的最大的一个盘搬到B3. 再把 n-1个盘从 C搬到 B,借助 A4. 当 n==1时,直接从 A搬到 B即可

A B C

22

A B C A B C

11

A B C

33

A B C

44

A B C

55

A B C

66

A B C

77

Page 16: Chapter 17 Recursion ( 递归 )

16

Eight Queens

EightQueenEightQueen

bool isValid(int row, int column){ for (int i = 1; i <= row; i++) if (queens[row - i] == column || queens[row - i] == column - i || queens[row - i] == column + i) return false; // There is a conflict return true; // No conflict}

queens[0] 0

queens[1] 4

queens[2] 7

queens[3] 5

queens[4] 2

queens[5] 6

queens[6] 1

queens[7] 3

Page 17: Chapter 17 Recursion ( 递归 )

17

§17.3 Recursion vs. Iteration (迭代 )

Negative aspects of recursion High cost in both time and memory

Recursion Iteration Any recursive function can be converted to non-

recursive (iterative) function When to use recursion? Depending on the

problem. Recursion is suitable for “recursive” problems

Page 18: Chapter 17 Recursion ( 递归 )

18

Recursion vs. Iteration

f(n)= n!

int factorial(int n){

int result;

int i;

for(i=1;i<=n;i++)

result *= i;

return result;

}

int factorial(int n){

int result;

if(n==0) result =1;

else result = n*factorial(n-1);

return result;

}

Page 19: Chapter 17 Recursion ( 递归 )

19

Recursion vs. Iteration

f(n) = 0 n=0

1 n=1

f(n-1)+f(n-2) n>1

int fib (int n){

int result;

if (n==0) result =0; else if (n==1) result =1; else result = fib (n-1)+ fib (n-2); return result;}

int fib (int n) {

int result, i, pre1, pre2 ; result = 0; i =2; pre2 = 1 ; while (i<=n) {

pre1 = pre2 ;pre2 = result ; result = pre1 + pre2;i++;

} return result;}

Page 20: Chapter 17 Recursion ( 递归 )

20

Summary

Concept of recursion Design of recursive functions Recursion vs. iteration

Page 21: Chapter 17 Recursion ( 递归 )

Homework Questions

1. Please write a recursive function to solve the Sudoku problem.

2. How to find all possible solutions for the Eight Queens problem?

(Just for exercise by yourself. No need to submitting it.)

21