如果你想对数组中的数字对求和,你必须决定是从左到右还是从右到左。根据您走的路线,初始输入和最终结果之间的所有间歇数组都会有所不同。请注意下面每个 sn-p 的输出。
递归将是解决这个问题的最简单方法。这一切都取决于你如何增加/减少你的 for 循环。
从左到右(递增)
const print = (arr) => console.log(...arr.map(JSON.stringify));
const recursiveSums = (numbers, result = [numbers]) => {
if (numbers == null || numbers.length === 0) throw new Error('array length less than 1');
if (numbers.length === 1) return result;
const subResult = [];
for (let i = 0; i < numbers.length; i += 2) {
subResult.push(numbers[i] + (numbers[i+1] ?? 0));
};
result.push(subResult);
return recursiveSums(subResult, result);
};
print(recursiveSums([1, 2, 3, 4, 5, 6, 7, 8])); // even
print(recursiveSums([5, 3, 8, 4, 1])); // odd
try { recursiveSums([]) } // error!
catch (e) { console.log(e.message); }
.as-console-wrapper { top: 0; max-height: 100% !important; }
输出
[1,2,3,4,5,6,7,8] [3,7,11,15] [10,26] [36]
[5,3,8,4,1] [8,12,1] [20,1] [21]
array length less than 1
从右到左(递减)
const print = (arr) => console.log(...arr.map(JSON.stringify));
const recursiveSums = (numbers, result = [numbers]) => {
if (numbers == null || numbers.length === 0) throw new Error('array length less than 1');
if (numbers.length === 1) return result;
const subResult = [];
for (let i = numbers.length - 1; i >= 0; i -= 2) {
subResult.unshift((numbers[i-1] ?? 0) + numbers[i]);
};
result.push(subResult);
return recursiveSums(subResult, result);
};
print(recursiveSums([1, 2, 3, 4, 5, 6, 7, 8])); // even
print(recursiveSums([5, 3, 8, 4, 1])); // odd
try { recursiveSums([]) } // error!
catch (e) { console.log(e.message); }
.as-console-wrapper { top: 0; max-height: 100% !important; }
输出
[1,2,3,4,5,6,7,8] [3,7,11,15] [10,26] [36]
[5,3,8,4,1] [5,11,5] [5,16] [21]
array length less than 1