chapter 17 recursion ( 递归 )
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 PresentationTRANSCRIPT
![Page 1: Chapter 17 Recursion ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/1.jpg)
Chapter 17 Recursion (递归 )
§17.1 Introduction
§17.2 Methodology of Recursion Design
§17.3 Recursion vs. Iteration
![Page 2: Chapter 17 Recursion ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/2.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/3.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/4.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/5.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/6.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/7.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/8.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/9.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/10.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/11.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/12.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/13.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/14.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/15.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/16.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/17.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/18.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/19.jpg)
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 ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/20.jpg)
20
Summary
Concept of recursion Design of recursive functions Recursion vs. iteration
![Page 21: Chapter 17 Recursion ( 递归 )](https://reader035.vdocuments.us/reader035/viewer/2022081418/56813522550346895d9c89b1/html5/thumbnails/21.jpg)
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