定义

函数调用自身,叫做递归。如果尾调用自身,就叫做尾递归。

优势

递归非常耗内存,容易发生栈溢出。
但是尾递归,只存在一个调用帧,不会发生栈溢出,相对节省内存。

递归函数的改写

柯里化 =》 将多参数的函数转换成单参数的形式

  1. function tailFactorial(n, total) {
  2. if (n === 1) return total
  3. return failFactorial(n-1, n * total)
  4. }
  5. function factorial(n) {
  6. return tailFactorial(n, 1)
  7. }
  8. factorial(5) // 120
  1. function tailFactorial(n, total) {
  2. if (n === 1) return total
  3. return tailFactorial(n-1, n * total)
  4. }
  5. function currying(fn, n) {
  6. return function(m) {
  7. return fn.call(this, m, n)
  8. }
  9. }
  10. const factorial = currying(tailFactorial, 1)
  11. factorial(5) // 120

es6 默认值

  1. function factorial(n, total = 1) {
  2. if (n === 1) return total
  3. return factorial(n - 1, n * total)
  4. }
  5. factorial(5) // 120

递归的本质是一种循环操作,纯粹的函数式编程没有循环操作命令,所有的循环都用递归实现。

尾递归优化

尾递归之所以要优化,是因为调用栈太多,造成溢出。所以就要减少调用栈。
一种方式是采用 循环回调递归。