NeailWiki

Because Change Happens.
Algorithm

Recursion

# 求 n 的阶乘

# 普通递归

function factorial(n) {
  if (n === 0) {
    return 1;
  } else {
    return n*factorial(n-1);
  }
}
//思路: n!=n*(n-1)*(n-2)*...*1
//       =n*(n-1)!

# 尾递归

function tailFactorial(n, total  = 1) {
  if (n === 0) {
    return total;
  } else {
    return tailFactorial(n-1, n*total)
  }
}
//思路:把结果作为参数传入函数中,n可以理解为有1到n个元素的栈
//假设n=4,栈中压入1,2,3,4四个元素,第一次调用函数,由于是累乘,传入默认参数total=1,
//4出栈,将4*total=4作为第一次运算结果传入第二次调用;此时,栈中还有三个元素,传入的total为4;
//3出栈,将3*total=12作为第一次运算结果传入第三次调用;此时,栈中还有两个元素,传入的total为12;
//2出栈,将2*total=24作为第一次运算结果传入第四次调用;此时,栈中还有一个元素,传入的total为24;
//1出栈,将1*total=24作为第一次运算结果传入第五次调用;
//此时,栈中没有元素了,传入的total为24,执行n=0时的语句,return total;
# 结果缓存
//这不是递归的写法,但是通过把结果缓存下来,能够很大程度上提高多次运算时的运算速度
let factorial = (function() {
  let result = [1,1];
  let calc = function(n) {
    if(n > (result.length - 1)) {
      for(let i = result.length; i <=n; i++) {
        result[i] = result[i-1] * i;
      }
    }
    return result[n];
  }
  return calc;
})()

Last Update: 2019-12-06 12:57:10 Source File