Curriculum created and presented by
Jeff Lee
@RebootJeff
function callMyself() {
callMyself();
}
What if you do a Google search for recursion?
function callMyself() {
if() {
// base case
return;
} else {
// recursive case
callMyself();
}
return;
}
Advice: Use a bottom-up approach by looking for patterns by starting with small or first few cases
function computeFactorial(num) {
var result = 1;
for(var i = 2; i <= num; i++) {
result *= i;
}
return result;
}
results *= 2;
results *= 3;
results *= 4;
results *= 5;
If we call computeFactorial(5), then the loop will run:
function computeFactorial(num) {
if(num === 1) {
return 1;
} else {
return num * computeFactorial(num - 1);
}
}
5 * computeFactorial(4)
4 * computeFactorial(3)
3 * computeFactorial(2)
2 * computeFactorial(1)
1
If we call computeFactorial(5), then the recursion will run:
function logNumbers(start, end) {
for(var i = start; i <= end; i++) {
console.log(i);
}
}
function logNumbersRecursively(start, end) {
function recurse(i) {
console.log(i);
if(i < end) {
recurse(i + 1);
}
}
recurse(start);
}
function runRecursiveLoop(start, end) {
function recurse(i) {
console.log(i);
if(i < end) {
recurse(i + 1);
}
}
recurse(start);
}
function runLoopAsMyself(i, end) {
console.log(i);
if(i < end) {
runLoopAsMyself(i + 1, end);
}
}
function runRecursiveLoop(start, end) {
(function recurse(i) {
console.log(i);
if(i < end) {
recurse(i + 1);
}
})(start);
}
function joinElements(array, joinString) {
var result = '';
var lastElement = array[array.length - 1];
for(var i = 0; i < array.length - 1; i++) {
result += array[i] + joinString;
}
return result + lastElement;
}
function joinElements(array, joinString) {
function recurse(index, resultSoFar) {
resultSoFar += array[index];
if(index === array.length - 1) {
return resultSoFar;
} else {
return recurse(index + 1, resultSoFar + joinString);
}
}
return iterate(0, '');
}
RangeError: Maximum Call Stack Exceeded
ES6
function computeFactorial(num) {
if(num <= 1) {
return 1;
} else {
return num * computeFactorial(num - 1);
}
}
function computeFactorial(num, resultSoFar) {
resultSoFar = resultSoFar || 1;
resultSoFar *= num;
if(num <= 1) {
return resultSoFar;
} else {
return computeFactorial(num - 1, resultSoFar);
}
}
The recursive call isn't the final step of this function:
Use an accumulator to convert to tail recursion!