在C#中使用递归函数

jas*_*son 0 c# recursion

我有一个方法,使用它来汇总和输出它out.我的方法看起来像这样:

public void MyMethod(int page, string city, out int citySum)
{
    citySum = 0;

    for(int i = 0; i < 50; i++)
    {
        citySum++;
    }

    if(page < 15)
    {
       MyMethod(page + 1, city,out citySum); 
    }
}
Run Code Online (Sandbox Code Playgroud)

令我困惑的是我想要citySum总计.但是使用此配置,citySum在每个递归步骤变为零.如何保持值citySum并将其传递到下一个递归步骤?

Man*_*mer 9

通过简单地引入一个新变量来临时保存结果

public void MyMethod(int page, string city, out int citySum)
{
    citySum = 0;

    for(int i = 0; i < 50; i++)
    {
        citySum++;
    }

    if(page < 15)
    {
        int tempSum = 0;
        MyMethod(page + 1, city, out tempSum); 
        citySum += tempSum;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者ref改为使用

public static void MyMethod(int page, string city, ref int citySum)
{
    for(int i = 0; i < 50; i++)
    {
        citySum++;
    }

    if(page < 15)
    {
        MyMethod(page + 1, city, ref citySum); 
    }
}
Run Code Online (Sandbox Code Playgroud)

关于小提琴的工作实例


或直接返回结果:

public static int MyMethod(int page, string city)
{
    int citySum = 0;

    for(int i = 0; i < 50; i++)
    {
        citySum++;
    }

    if(page < 15)
    {
        citySum += MyMethod(page + 1, city); 
    }

    return citySum;
}
Run Code Online (Sandbox Code Playgroud)

关于小提琴的工作实例


The*_*der 5

不要使用 out 并从方法中返回 int。也使用+= 50使代码更干净。

public int MyMethod(int page, string city, int citySum = 0)
{
    //for (int i = 0; i < 50; i++)
    //{
    //  citySum++;
    //}

    citySum += 50;

    if (page < 15)
    {
        return MyMethod(page + 1, city, citySum);
    }

    return citySum;
}
Run Code Online (Sandbox Code Playgroud)

注意这里默认citySum设置为0,但可以通过调用方法设置。要解决此问题,您可以使用一种public方法,通过将其更改为private

public int MyMethod(int page, string city)
{
    return MyMethod(page, city, 0);
}

private int MyMethod(int page, string city, int citySum)
{
    //...
Run Code Online (Sandbox Code Playgroud)