为什么成员变量不遵循递归返回规则?

时间:2019-08-31 03:22:10

标签: c# recursion

我正在使用递归来计算两个变量。当我从方法中将一个变量定义为成员变量时,让我感到困惑的是,它返回最后分配给变量的值而不是第一个分配给变量的值?为什么会这样?

class Program
{
    int a = 3;
    static void Main(string[] args)
    {
        Program program = new Program();
        int result = program.Test();
        Console.WriteLine(result); // result = 0
        Console.ReadKey();
    }

    private int Test()
    {
        a--;
        if(a != 0)
        {
            Test();
        }
        return a;
    }
}


class Program
{
    static void Main(string[] args)
    {
        Program program = new Program();
        int result = program.Test(3);
        Console.WriteLine(result); // result = 2
        Console.ReadKey();
    }

    private int Test(int a)
    {
        a--;
        if(a != 0)
        {
            Test();
        }
        return a;
    }
}

我想知道这是怎么发生的?还有其他规则会影响递归返回顺序吗?对我来说,我认为如果不使用out或ref,则应复制该成员变量以进行计算。那么有人可以帮助我找到原因吗? 非常感谢。

3 个答案:

答案 0 :(得分:1)

这可以按预期工作:

 private int Test(int a){
            a--;
            if (a != 0)
                return Test(a);
            return a;
        }

如果不返回测试结果,它将仅运行该方法,然后转到该方法的下一条语句。在您的情况下,如果没有return Test(a),它将不会对Test(int a)的结果产生任何影响。

编辑:

通过引用传递具有相似工作代码的示例

static void Main(string[] args)
        {
            Program program = new Program();
            int a = 3;
            int result = program.Test(ref a);
            Console.WriteLine(result); // result = 0
            Console.ReadKey();
        }

        private int Test(ref int a)
        {
            a--;
            if (a != 0)
            {
                Test(ref a);
            }
            return a;
        }

答案 1 :(得分:0)

a的值由Test()更改。每次Test的调用都使用相同的变量a

如果要复制,请自己制作:

private int Test()
{
    int b = a--;
    if(a != 0)
    {
        Test();
    }
    return b;
}

答案 2 :(得分:0)

省略了this关键字,这使成员变量看起来像普通的局部变量,但是它们在原理上有所不同。成员变量引用相同的实例。

private int Test()
{
    this.a--;
    if(this.a != 0)
    {
        this.Test();
    }
    return this.a;
}