You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用递归计算二维数组首尾行总和的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:24