Functions
Recursion
Recursion solves a small problem by calling the same function with a smaller value.
base case
A recursive function needs a base case that stops the chain of calls.
Recursion
recursion.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
int factorial(int value) {
if (value <= 1) {
return 1;
}
return value * factorial(value - 1);
}
int main() {
int value = 4;
int result = factorial(value);
std::cout << "value=" << value << std::endl;
std::cout << "factorial=" << result << std::endl;
return 0;
}
#include <iostream>
int factorial(int value) {
if (value <= 1) {
return 1;
}
return value * factorial(value - 1);
}
int main() {
int value = 3;
int result = factorial(value);
std::cout << "value=" << value << std::endl;
std::cout << "factorial=" << result << std::endl;
return 0;
}
#include <iostream>
int factorial(int value) {
if (value <= 1) {
return 1;
}
return value * factorial(value - 1);
}
int main() {
int value = 5;
int result = factorial(value);
std::cout << "value=" << value << std::endl;
std::cout << "factorial=" << result << std::endl;
return 0;
}
value ← 4
10int main() {11 int value→ 4 = 4; //@value=3, 512 int result = factorial(value4);int factorial(int value)
pass 1 of 43int factorial(int value4) {4 if (value <= 1) {5 return 1;6 }7 return value4 * factorial(value - 1);8}All 4 passes — pass 1 is the card above pass value1 4 2 3 3 2 4 1 if (value <= 1)
3int factorial(int value) {4 if (value1 <= 1) {5 return 1;6 }result ← 24
11 int value = 4; //@value=3, 512 int result→ 24 = factorial(value4);1314 std::cout << "value=" << value4 << std::endl;15 std::cout << "factorial=" << result24 << std::endl;16 return 0;17}outputvalue=4 factorial=24
value ← 3
10int main() {11 int value→ 3 = 3;12 int result = factorial(value3);int factorial(int value)
pass 1 of 33int factorial(int value3) {4 if (value <= 1) {5 return 1;6 }7 return value3 * factorial(value - 1);8}All 3 passes — pass 1 is the card above pass value1 3 2 2 3 1 if (value <= 1)
3int factorial(int value) {4 if (value1 <= 1) {5 return 1;6 }result ← 6
11 int value = 3;12 int result→ 6 = factorial(value3);1314 std::cout << "value=" << value3 << std::endl;15 std::cout << "factorial=" << result6 << std::endl;16 return 0;17}outputvalue=3 factorial=6
value ← 5
10int main() {11 int value→ 5 = 5;12 int result = factorial(value5);int factorial(int value)
pass 1 of 53int factorial(int value5) {4 if (value <= 1) {5 return 1;6 }7 return value5 * factorial(value - 1);8}All 5 passes — pass 1 is the card above pass value1 5 2 4 3 3 4 2 5 1 if (value <= 1)
3int factorial(int value) {4 if (value1 <= 1) {5 return 1;6 }result ← 120
11 int value = 5;12 int result→ 120 = factorial(value5);1314 std::cout << "value=" << value5 << std::endl;15 std::cout << "factorial=" << result120 << std::endl;16 return 0;17}outputvalue=5 factorial=120
Follow the Calls
valuestarts as4.factorial(4)returns4 * factorial(3).- The chain continues through
3,2, and the base case1. - The multiplied result is
24. - The program prints
value=4andfactorial=24. | call | result path | | --- | --- | |factorial(1)| 1 | |factorial(2)|2 * 1 = 2| |factorial(3)|3 * 2 = 6| |factorial(4)|4 * 6 = 24|
Exercise: recursion.cpp
Reproduce value=4 and factorial=24, then use the pinned value variants 3 and 5 to predict factorial=6 and factorial=120.