下面三角形的数列:
1
3 5
7 9 11
13 15 17 19
21 23 25 27 29
...
写一个函数,给定行的序号,然后求和:
rowSumOddNumbers(1) // 1
rowSumOddNumbers(2) // 3+5=8
rowSumOddNumbers(3) // 7+9+11=27
rowSumOddNumbers(42) // 74088
几种解法
/*
* 下面三角形的数列:
*
1 1
3 5 1 + 2 * 1
7 9 11 1 + 2 * 1 + 2 * 2
13 15 17 19 1 + 2 * 1 + 2 * 2 + 2 * 3
21 23 25 27 29
...
* 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 0 第n行,第1个数
* 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 1 第n行,第2个数
* 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 2 第n行,第3个数
* 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * 3 第n行,第4个数
* ...
* 1 + 2 * 0 + 2 * 1 + 2 * 2 + 2 * 3 + ... + 2 * (n - 1) + 2 * (n - 1) 第n行,第n个数
* 第n行,第n个数 相当于 1 + n * (n - 1) + (n - 1) * 2
*
* n * (1 + n * (n - 1)) + 2 * ((n - 1) * n ) / 2
* n + n^2 * (n - 1) + n * (n - 1)
* n^2 * (n - 1) + n^2
* n^3
*
* 写一个函数,给定行的序号,然后求和:
*
* rowSumOddNumbers(1) // 1
* rowSumOddNumbers(2) // 3+5=8
* rowSumOddNumbers(3) // 7+9+11=27
* rowSumOddNumbers(42) // 74088
*
* */
const rowSumOddNumbers = (n) => {
return Math.pow(n, 3)
};
function rowSumOddNumbers(num){
return Math.pow(num,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
}