使用递归计算二维数组首尾行总和的C#代码优化咨询
优化你的C#递归求和实现
嘿,你的递归实现逻辑是完全正确的,功能上没问题,但确实存在代码冗余的情况——sumFirstRow和sumLastRow除了行索引(0和1)几乎没有区别,我们可以通过参数化的方式把它们合并,同时保持纯递归的实现,完全不用for循环。
先确认当前实现的合理性
你的递归思路是对的:通过逐步缩小列数N,将求和问题分解为「累加当前列元素」+「累加剩余列元素」,基础case(N<=0返回0)也设置得很准确,所以从功能和递归逻辑上来说,当前实现是合理的,只是可以优化代码复用性。
优化方案1:合并为通用递归函数
我们可以把两个行求和函数合并成一个接收行索引参数的通用函数,这样只需要维护一套递归逻辑即可:
using System; namespace RecursionPractice { class Program { // 通用递归函数:求指定行的元素和 static int sumRow(int[,] twoDArr, int rowIndex, int columnCount) { if (columnCount <= 0) return 0; // 递归累加当前列元素 + 剩余列的和 return sumRow(twoDArr, rowIndex, columnCount - 1) + twoDArr[rowIndex, columnCount - 1]; } static int sumFirstLastRows(int[,] twoDArr) { int columnLength = twoDArr.GetLength(1); // 分别调用通用函数,传入第一行和最后一行的索引 return sumRow(twoDArr, 0, columnLength) + sumRow(twoDArr, twoDArr.GetLength(0)-1, columnLength); } static void Main(string[] args) { int[,] twoD = new int[,] {{ 1, 3, 5 }, { 2, 4, 6 }}; Console.WriteLine(sumFirstLastRows(twoD)); // 输出 21 Console.ReadLine(); } } }
这个优化的好处很明显:
- 消除了重复代码,后续如果要修改递归逻辑(比如调整基础case或累加规则),只需要改一个函数
- 扩展性更好:如果以后需求变成求任意行的和,直接调用
sumRow传入对应行索引即可
优化方案2:单递归函数直接累加两行
如果想要更紧凑的实现,我们可以把整个求和逻辑合并成一个递归函数,直接同时累加第一行和最后一行的对应列元素:
using System; namespace RecursionPractice { class Program { static int sumFirstLastRows(int[,] twoDArr, int columnCount) { if (columnCount <= 0) return 0; // 累加当前列的两个元素 + 剩余列的总和 return sumFirstLastRows(twoDArr, columnCount - 1) + twoDArr[0, columnCount - 1] + twoDArr[twoDArr.GetLength(0)-1, columnCount - 1]; } static void Main(string[] args) { int[,] twoD = new int[,] {{ 1, 3, 5 }, { 2, 4, 6 }}; Console.WriteLine(sumFirstLastRows(twoD, twoD.GetLength(1))); // 输出 21 Console.ReadLine(); } } }
这个方案把整个求和逻辑浓缩到一个递归函数里,没有中间函数,代码更简洁。它的递归思路是:每次处理第columnCount-1列(数组0索引),把第一行和最后一行该列的元素加起来,再加上前columnCount-1列的总和,直到列数为0时返回0。
总结
两种优化方案都完全符合你的要求:纯递归实现,没有使用任何for循环,同时解决了原代码的冗余问题。你可以根据自己的偏好选择:
- 如果需要更高的复用性和模块化,选方案1
- 如果追求代码紧凑简洁,选方案2
内容的提问来源于stack exchange,提问作者user9867617
相关产品推荐
相关产品推荐

