FreeCodeCamp 初级算法题 - 计算整数阶乘

02.Basic Algorithm Scripting - Factorialize a Number

Posted by Azr on January 2, 2018

如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。

Factorialize a Number

如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。

阶乘通常简写成 n!

例如: 5! = 1 * 2 * 3 * 4 * 5 = 120

当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。

这是一些对你有帮助的资源:

factorialize(5) 应该返回一个数字

factorialize(5) 应该返回 120.

factorialize(10) 应该返回 3628800.

factorialize(20) 应该返回 2432902008176640000.

factorialize(0) 应该返回 1.

function factorialize(num) {
  // 请把你的代码写在这里
  return num;
}
factorialize(5);

问题解释

  1. func接受一个整数为参数,返回阶乘的计算结果

  2. e.g. : 3!= 1 * 2 * 3 = 6

    ​ 4!= 1 * 2 * 3 * 4 = 24

    ​ 5! = 1 * 2 * 3 * 4 * 5 = 120

基本解法

思路

  1. 需要一个循环,把每一步的数字相乘
  2. 注意:0 和 1 的阶乘都是1

代码for循环

function factorialize(num) {
 var result = 1;
 for (var i = 1 ; i <= num; i++ ){
     result *= num;
 }
 return result;
}
factorialize(5);

解释

  1. result的初始值是1,0 和 1 的阶乘都是1
  2. var i = 1,可以让0和1不进入循环
  3. result * = num,进行计算并重新赋值

代码 while循环

function factorialize(num) {
  var result = 1;
  while( num > 1 ) {
      result * = num;
      num--;
  }
  return result;
}
factorialize(5);

解释

  1. result的初始值是1,0 和 1 的阶乘都是1
  2. num > 1,可以让0和1不进入循环
  3. result * = num,进行计算并重新赋值
  4. 为了防止死循环,一定要写num--的终止条件

使用 reduce

思路

  1. 使用reduce,需要根据num创建一个数组
  2. 可以使用Array.from来创建数组

Link

  1. Array.from
  2. Array.keys
  3. Array.map
  4. Array.reduce

代码

function factorialize(num) {
  return Array.from(Array(num).keys()).map(e => e + 1).reduce((prev, next) => {
        retrun prev * next;
    }, 1);
}
factorialize(5);

解释

  1. .keys() 返回的是类数组,从 0 开始,而我们需要返回从 1 开始的数组。所以,需要在 map 里面加上 1

递归

代码

function factorialize(num) {
    // 初始及弹出条件
    if (num === 0) {
        return 1;
    }
    // 递归调用
    return num * factorialize(num - 1)
}

解释

  1. 初始判断条件:如果设置为 if (num === 1) 是不行的,这样传入 0 的时候就不能得到 1
  2. 注意:传入的数字比较大,会发生stack overflow,可以使用尾调用优化

本文首次发布于 Azr的博客, 作者 @azrrrrr ,转载请保留原文链接.

原文链接:http://amor9.cn/2018/01/03/challenges-factorialize-a-number/