【前端-JavaScript】Web前端中script标签下 50! 阶乘 分析-魏泯

分成两组实验进行对比

这就是第一种:num=i*i(+1);

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>50!</title>
    </head>
    <body>

    </body>

    <!--还是在body下面写javascript代码-->

    <script type="text/javascript">

//定义一个变量

//为了写for循环,所以定义一个循环控制变量i;

        var num = 0;

        var i = 1;

//循环条件是 i 的值为1,每次判断 i 小于等于50时,就执行代码块,同时i自增1;

        for(i=1;i<=50;i++){

//循环内容是 将i于i加1的乘积赋值给num;

           num=i*(i+1);

            
        }
        /*
         我先记录一下,第一次运行的时候 i = 1 符合 <= (小于等于五十)的循环条件
         那么开始循环:i+1等于2 与 i本身(1)相乘,等于2;然后将其值赋给num,此时 num = 2;
        
        第二次运行的时候 i = 2 符合 小于等于五十的循环条件
        那么开始循环;i+1=3 与i本身(2)相称,等于6;然后赋值给num,此时num = 6;
        
        第三次依然符合循环条件(小于五十)
        这个时候  i已经变成了3 那么就是与4相称 得出的6赋给num ;所以num = 12;    
        当然这个时候 我们已经显而易见的就是 这个推导式是错误的
        因为4的阶乘等于4*3*2*1
        也就是说 num此时应该等于24;不应该等于12;
        
        为了证实我刚才的理论
        我进行下一步论证
        那么第四次的时候 显而易见 就是 5与4相称
        得到的无非是20
        
        第五次呢?
        就是六与五相乘= 30;
        
        诸如此类  循环到了50的时候 (仍然符合循环条件,所以执行),反而成了51乘50;
        50!(五十的阶乘能等于2550吗?)
        不可能
        所以 我把上面的东西注释掉 重新开始写;
        
        */
        console.log(num);
    </script>
    

</html>

 

 

那么这是第二次的:num *= i;

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>50!阶乘</title>
    </head>
    <body>
    </body>
    <script type="text/javascript">
        /*那么呢 我现在要开始写一个50的阶乘,我用的是别人的代码,但是我一步一步开始分析,一步一步开始练习
         一遍一遍开始学习。
         首先要在 body标签下面新建Script标签;在这个标签内进行变量的初始化和函数的定义。
         */
        //也就是使用var定义循环变量和一个存储值的num变量
        
        var i = 1;
        var num = 1;
        //这个时候我写一个for循环
        for(i=1;i<=50;i++){
            //到这里我想i应该是作为被乘数存在的
            num*=i;//num = num * i;
            
        }
        //在调试界面输出num的值(最终结果)\n
        console.log(num);
        
        /*那么现在开始分析
         第一次运行(执行循环)的时候  i 等于 1 符合循环条件 (小于等于五十) 并且在结束这次循环之后,i+1变成2
        这个时候的num也是1 所以这次的运行内容就是 1*1 最后赋值给num = 1 (注意num这个时候是全局变量)
        第二次执行循环的时候,如上所述 i 变成了 2。  那么它是符合小于等于五十的条件的,所以继续执行函数体,
        值得一提的是,i的步长值为1,也就是在函数执行完成后(进行再一次判断前),i就会由2变成3(然后以这一个值进行接下来的条件判断和参与运算);
        这个时候 我们清晰的记得 num 的值 等于1, 根据函数体表达式,num(1)要与作为乘数的i(2)进行乘法运算;
        我们都知道 1*2 = 2 ,再赋值给 num; num 变成  了 2;(再次强调 num是一个全局变量,为什么我一次次强调,因为局部变量常常会每次进行初始化;)
        
        所以就开始了第三次运算,这个时候i就是3,num 是2;
        这次运算的时候3*2,num变成了6,执行过后 i+1 = 4;
        
        4就可以参与下一次的运算和循环判断,就是4和6相乘,num变成了24;
        
        i (4>5) i*num(24)
        num=5*24=120;
        
        i(5>6) i*num(120)= 720;
        num = 720;
        
        i(6>7) i*num(720)=5040;
        num = 5040;
        
        i(7>8) i*num(5040)=43200;
        num = 43200;
        
        i(8>9) i*num(43200) = 388800;
        num = 388800;
        
        i(9>10) i*num(388800) = 3888000;
        num = 3888000;
        
        后面我不算了,累了,我还以为自己在口算呢,
        
          
       
        
        */
        
    </script>
    

</html>

我总结了,这一种算法会存储每一次相乘。
        而上一种不会。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章