【前端-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>

我總結了,這一種算法會存儲每一次相乘。
        而上一種不會。

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