定义
优势
递归非常耗内存,容易发生栈溢出。
但是尾递归,只存在一个调用帧,不会发生栈溢出,相对节省内存。
递归函数的改写
柯里化 =》 将多参数的函数转换成单参数的形式
function tailFactorial(n, total) {
if (n === 1) return total
return failFactorial(n-1, n * total)
}
function factorial(n) {
return tailFactorial(n, 1)
}
factorial(5) // 120
function tailFactorial(n, total) {
if (n === 1) return total
return tailFactorial(n-1, n * total)
}
function currying(fn, n) {
return function(m) {
return fn.call(this, m, n)
}
}
const factorial = currying(tailFactorial, 1)
factorial(5) // 120
es6 默认值
function factorial(n, total = 1) {
if (n === 1) return total
return factorial(n - 1, n * total)
}
factorial(5) // 120
递归的本质是一种循环操作,纯粹的函数式编程没有循环操作命令,所有的循环都用递归实现。
尾递归优化
尾递归之所以要优化,是因为调用栈太多,造成溢出。所以就要减少调用栈。
一种方式是采用 循环回调递归。