Skip to content

Instantly share code, notes, and snippets.

@eugeneglova
Created February 27, 2017 09:32
Show Gist options
  • Save eugeneglova/721048d0386c9791b1ce81fdb26130c9 to your computer and use it in GitHub Desktop.
Save eugeneglova/721048d0386c9791b1ce81fdb26130c9 to your computer and use it in GitHub Desktop.
tail call recursion optimization for factorial and fibonacci
'use strict';
const factorial = n => n < 2 ? 1 : n * factorial(n - 1)
// run with --harmony and "use strict" to optimize tail call recursion
const factorialOptimizedTailRecursion = (n, acc = 1) => n < 2 ? acc : factorialOptimizedTailRecursion(n - 1, acc * n)
const n = 100000000
// console.log(factorial(n)) // RangeError: Maximum call stack size exceeded
console.log(factorialOptimizedTailRecursion(n)) // Infinity
// 1 1 2 3 5 8 13 21 34 55
const fibonacci = n => n < 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2)
const fibonacciOptimizedTailRecursion = (n, acc = 1) => n < 2 ? acc : fibonacciOptimizedTailRecursion(n - 1, fibonacciOptimizedTailRecursion(n - 2, acc + 1))
const fibonacciOptimizedMemoization = (n, acc = {}) => acc[n] ? acc[n] : acc[n] = n < 2 ? 1 : fibonacciOptimizedMemoization(n - 1, acc) + fibonacciOptimizedMemoization(n - 2, acc)
const arr = [10,11,12,13,14,15,16,17,18,19,45]
console.log(arr.map(n => fibonacciOptimizedMemoization(n))) // works immediately
console.log(arr.map(n => fibonacci(n))) // works too long
console.log(arr.map(n => fibonacciOptimizedTailRecursion(n))) // works even a bit longer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment