今天有个面试,昨晚按老赵的博客改了三个阶乘函数,让面试者从递归、尾递归优化、爆栈角度分析。

function factorial(n) {
  if (n === 0) return 1
  return n * factorial(n - 1)
}
const v1 = factorial(4)

function tail_factorial(n, acc = 1) {
  if (n === 0) return acc
  return tail_factorial(n - 1, acc * n)
}
const v2 = tail_factorial(4)

const identity = v => v
function next_factorial(n, next = identity) {
  if (n === 0) return next(1)
  return next_factorial(n - 1, r => next(n * r))
}
const v3 = next_factorial(4)

console.log(v1, v2, v3)