zoukankan      html  css  js  c++  java
  • Factorialize a Number——阶乘(fcc算法题)

    题目:Factorialize a Number(计算一个整数的阶乘)

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

    阶乘通常简写成 n!

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

    提示:

    分析:

    Factorial称之为阶乘, 维基百科 是这样描述的“ 一个正整数的阶乘是所有小于及等于该数的正整数的积,并且有 0 的阶乘为 1 。自然数 n 的阶乘写作 n! 。”

    而阶乘函数是 递归(Haskell)函数 典型示例。在JavaScript中可能运用到递归函数。但在实际使用中,你可能没有考虑何时何地递归是有用的,或者使用不好会带来很多问题。

    阶乘函数

    先来简单的看看数学上阶乘函数,开头也说过,阶乘函数的参数是一个自然数,它返回 1 与此数之间所有数的乘积。比如, 6 的阶乘是 1 × 2 × 3 × 4 × 5 × 6 = 720 ,而这样的方式,可以用一种递归函数来表示。如果 n 是 6 ,其模式是:

    0! = 1
    1! = 1
    2! = 2 * 1
    3! = 3 * 2 * 1
    4! = 4 * 3 * 2 * 1
    5! = 5 * 4 * 3 * 2 * 1
    6! = 6 * 5 * 4 * 3 * 2 * 1
    

    如此一来,阶乘可以简单的这样定义:

    • 0 的阶乘是 1
    • 任何数的阶乘都是此数乘以比此数小一的数的阶乘

    可以定义一个 factorial() 函数来表示:

    factorial (0) = 1
    factorial (n) = n * factorial (n - 1)
    

    第一行表示 0 的阶乘是 1 ,第二行表示任意别的数 n 的阶乘等于 n 乘以 n-1 的阶乘。注意 那个把 n-1 括起来的括弧:没有这个括弧代码就会被解析称为 (factorial n) - 1 ;函数行为的优先级是很高的,会最先执行 。

    解法1:采用递归函数

    function factorial (num) {
        // 如果num是一个小于0的整数,就会拒绝
        if (num < 0) {
            return -1;
        } esle if (num === 0 || num === 1) {
            // 如果num是一个0或者1,其阶乘是1
            return 1;
        } else {
            // 调用递归
            return (num * factorial (num - 1));
            /*
             * 第一部分:不会只调用一次,会有多个嵌套
             * 每次调用  num === ?      num * factorial (num - 1)
             * 1st     factorial(5)    5 * factorial(5 - 1) => factorial(4)
             * 2nd     factorial(4)    4 * factorial(4 - 1) => factorial(3)
             * 3rd     factorial(3)    3 * factorial(3 - 1) => factorial(2)
             * 4th     factorial(2)    2 * factorial(2 - 1) => factorial(1)
             * 5th     factorial(1)    1 * factorial(1- 1) => factorial(0)
             * 第二部分: 如果条件符合,数字num本身乘于1 => num * 1, 
             * 并且函数将返回总的积
             * 5th => 5 * (5 - 1) => num = 5 * 4 = 20
             * 4th => 20 * (4 - 1) => num = 20 * 3 = 60
             * 3rd => 60 * (3 - 1) => num = 60 * 2 = 120
             * 2nd => 120 * (2 - 1) => num = 120 * 1 = 120
             * 1st => 120 => num = 120
             * 将上面的过程写成一行:(5*(5-1)*(4-1)*(3-1)*(2-1))=5*4*3*2*1=120
             */
        }
    }
    

    去掉注释:

    function factorial (num) {
        if (num < 0) {
            return -1;
        } else if (num === 0 || num === 1) {
            return 1;
        } else {
            return (num * factorial(num - 1));
        }
    }
    

    解法2:使用 while 循环

    function factorial (num) {
        // 第一步:创建一个变量result来存储num结果
        var result = num;
        // 如果num 小于 0, 就会拒绝
        if (num < 0) {
            return -1;
        } else if (num === 0 || num === 1) {
            // 如果num = 0 或者 num = 1,factorial将返回1
            return 1;
        } else {
            // 创建一个while循环
            while (num > 1) {
                // 每次迭代num 自减1
                num--;
                result *= num;
                /*
                 * 迭代次数     num  num--  result   result *= num
                 * 1st          5    4       5        20 = 5 * 4
                 * 2nd          4    3      20        60 = 20 * 3
                 * 3rd          3    2      60        120 = 60 * 2
                 * 4th          2    1      120       120 = 120 * 1
                 * 5th          1    0      120
                 * 结束遍历
                 */
            }
        }
        // 返回factorial最终乘积
        return result;
    }
    

    去掉注释:

    function factorial (num) {
        var result = num;
        if (num < 0) {
            return -1;
        } else if (num === 0 || num === 1) {
            return 1;
        } else {
            while (num > 1) {
                num--;
                result *= num;
            }
        }
        return result;
    }
    

    解法3:使用 for 循环

    function factorial ( num ) {
        // 如果 num 小于 0,factorial将终止
        if (num < 0) {
            return -1;
        } else if (num === 0 || num === 1) {
            // 如果num = 0 或 num = 1,factorial将返回1
            return 1;
        } else {
            // 开始for 循环,每次遍历减1
            for (var i = num - 1; i >= 1; i--) {
                num *= i;
    
                /*
                 *  遍历次数  num   i = num - 1   num *= i       i--  i>= 1?
                 *  1st       5    4 = 5 - 1     20 = 5 * 4      3    yes
                 *  2nd      20    3 = 4 - 1     60 = 20 * 3     2    yes
                 *  3rd      60    2 = 3 - 1     120 = 60 * 2    1    yes
                 *  4th     120    1 = 2 - 1     120 =  120 * 1  0    no
                 *  5th     120    0             120
                 * 结束for循环
                 */
            }
    
        }
        return num;
    }
    

    去掉注释:

    function factorial (num) {
        if (num < 0) {
            return -1;
        } else if (num === 0 || num === 1) {
            return 1;
        } else {
            for (var i = num - 1; i >= 1; i--) {
                num *= i;
            }
        }
        return num;
    }
    

    原题链接:Factorialize a Number

    转自:大漠 - JavaScript算法练习:阶乘(Factorial)函数

  • 相关阅读:
    JavaScript 为字符串添加样式 【每日一段代码80】
    JavaScript replace()方法 【每日一段代码83】
    JavaScript for in 遍历数组 【每日一段代码89】
    JavaScript 创建用于对象的模板【每日一段代码78】
    html5 css3 新元素简单页面布局
    JavaScript Array() 数组 【每日一段代码88】
    JavaScript toUTCString() 方法 【每日一段代码86】
    位运算
    POJ 3259 Wormholes
    POJ 3169 Layout
  • 原文地址:https://www.cnblogs.com/cq7216/p/6650472.html
Copyright © 2011-2022 走看看