下面三角形的数列:

    1. 1
    2. 3 5
    3. 7 9 11
    4. 13 15 17 19
    5. 21 23 25 27 29
    6. ...
    • 写一个函数,给定行的序号,然后求和:

      1. rowSumOddNumbers(1) // 1
      2. rowSumOddNumbers(2) // 3+5=8
      3. rowSumOddNumbers(3) // 7+9+11=27
      4. rowSumOddNumbers(42) // 74088
    • 几种解法

    1. /*
    2. * 下面三角形的数列:
    3. *
    4. 1 1
    5. 3 5 1 + 2 * 1
    6. 7 9 11 1 + 2 * 1 + 2 * 2
    7. 13 15 17 19 1 + 2 * 1 + 2 * 2 + 2 * 3
    8. 21 23 25 27 29
    9. ...
    10. * 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 0 第n行,第1个数
    11. * 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 1 第n行,第2个数
    12. * 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 2 第n行,第3个数
    13. * 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 3 第n行,第4个数
    14. * ...
    15. * 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * (n - 1) 第n行,第n个数
    16. * 第n行,第n个数 相当于 1 + n * (n - 1) + (n - 1) * 2
    17. *
    18. * n * (1 + n * (n - 1)) + 2 * ((n - 1) * n ) / 2
    19. * n + n^2 * (n - 1) + n * (n - 1)
    20. * n^2 * (n - 1) + n^2
    21. * n^3
    22. *
    23. * 写一个函数,给定行的序号,然后求和:
    24. *
    25. * rowSumOddNumbers(1) // 1
    26. * rowSumOddNumbers(2) // 3+5=8
    27. * rowSumOddNumbers(3) // 7+9+11=27
    28. * rowSumOddNumbers(42) // 74088
    29. *
    30. * */
    31. const rowSumOddNumbers = (n) => {
    32. return Math.pow(n, 3)
    33. };
    1. function rowSumOddNumbers(num){
    2. return Math.pow(num,3);
    3. }
    这是一个等差数列,算的就是从某一项到这一项加上对应层数值那一项的前 n 项和
    
    ```js
    let rowSumOddNumbers = n => {
        // 公差
        let d = 2;
        // 当前为 1 层上面的数字总个数为 0 = 0,
        // 当前为 2 层上面的数字总个数为 0 + 1 = 1
        // 当前为 3 层上面的数字总个数为 0 + 1 + 2 = 3
        // 当前为 4 层上面的数字总个数为 0 + 1 + 2 + 3 = 6
        // 当前为 n 层上面的数组总个数为 0 + 1 + 2 + ...... + n - 1
        // 设置变量 up 为 n - 1,相当于从 0 加到 up 求总个数,演算后上面总个数的公式为 up * (up - 1) / 2
        let up = n - 1;
        let count = up * (up + 1) / 2; // 上面的总个数
        // 求每一行的开头第一个数,其实是上面的数字总个数乘以公差加上第一个数,即 count * d + 1
        let start = count * d + 1;
        // 等差数列前 n 项和公式为 Sn = n * a1 + (n * (n - 1) / 2) * d
        // 其中 a1 为 start,即开始项,层数等于本层求和数列的个数,n 即为层数 n,d 为公差
        return n * start + (n * (n - 1) / 2) * d;
    }
    

    将上面的变量替换成代数式带入前 n 项和公式,并将公差 d 替换为 2,优化代码得:

    let rowSumOddNumbers = n => n * (((n - 1) * ((n - 1) + 1) / 2) * 2 + 1) + (n * (n - 1) / 2) * 2;
    

    化简上面数学公式得 n³

    let rowSumOddNumbers = n => Math.pow(n, 3);
    

    测试

    console.log(rowSumOddNumbers(1)); // 1
    console.log(rowSumOddNumbers(2)); // 8
    console.log(rowSumOddNumbers(3)); // 27
    console.log(rowSumOddNumbers(42)); // 74088
    

    一个工科生思维的解法,不知道是不是想的复杂了。

    ```javascript
    function rowSumOddNumbers(n) {
      return n*n*n
    }