如何实现矩阵对角线和绝对差计算函数?JS代码输出NaN问题排查
矩阵对角线和绝对差函数的NaN问题解决
需求说明
需要实现一个函数,接收二维整数数组,计算主、副对角线元素和的绝对差。例如输入:
[ [4, 5, 1], [2, 5, 6], [9, 8, 9] ]
计算逻辑:
- 主对角线和:4+5+9=18
- 副对角线和:1+5+9=15
- 绝对差:|18-15|=3
预期输出为3。
问题代码
编写的JavaScript代码运行后输出NaN:
function Difference(arr) { var n = arr.length; var d1; var d2; for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { // finding the sum of primary diagonal if (i == j) { d1 += arr[i][j]; } // finding the sum of secondary diagonal if (i + j == n - 1) { d2 += arr[i][j]; } } } return Math.abs(d1 - d2); } console.log(Difference([ [4, 5, 1], [2, 5, 6], [9, 8, 9] ]))
问题根源
变量d1和d2未初始化,默认值为undefined。当执行d1 += arr[i][j]时,相当于undefined + 数字,结果会变成NaN,后续所有运算都会保留NaN,最终返回NaN。
修复方案
方案1:初始化求和变量
给d1和d2初始赋值为0,原逻辑不变:
function Difference(arr) { var n = arr.length; var d1 = 0; // 初始化为主对角线和的初始值 var d2 = 0; // 初始化为辅对角线和的初始值 for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { if (i == j) { d1 += arr[i][j]; } if (i + j == n - 1) { d2 += arr[i][j]; } } } return Math.abs(d1 - d2); } console.log(Difference([ [4, 5, 1], [2, 5, 6], [9, 8, 9] ])) // 输出3
方案2:优化循环(更高效)
不需要嵌套循环,主对角线的位置是arr[i][i],副对角线的位置是arr[i][n-1-i],一层循环即可完成求和:
function Difference(arr) { var n = arr.length; var d1 = 0; var d2 = 0; for (var i = 0; i < n; i++) { d1 += arr[i][i]; // 主对角线元素 d2 += arr[i][n - 1 - i]; // 副对角线元素 } return Math.abs(d1 - d2); } console.log(Difference([ [4, 5, 1], [2, 5, 6], [9, 8, 9] ])) // 输出3
内容的提问来源于stack exchange,提问作者Mu'adhim
相关产品推荐
相关产品推荐

