C# 在表达式体成员中使用重新分配的参数进行递归调用

C# 在表达式体成员中使用重新分配的参数进行递归调用,c#,C#,我认为这个递归模式实现起来有点整洁,但我很难做到这一点。是否可以在表达式体成员中重新分配传递的参数?我想这就是我在这里遇到的限制。根据EBM上的MSDN,它说: 只能将赋值、调用、递增、递减和新对象表达式用作语句 我正在实现这一点,所以我不确定这为什么不起作用 这是我想要实现的工作版本: List<int> data = new List<int> { 120183, 105169, 58942 }; int result = 0; int cal

我认为这个递归模式实现起来有点整洁,但我很难做到这一点。是否可以在表达式体成员中重新分配传递的参数?我想这就是我在这里遇到的限制。根据EBM上的MSDN,它说:

只能将赋值、调用、递增、递减和新对象表达式用作语句

我正在实现这一点,所以我不确定这为什么不起作用

这是我想要实现的工作版本:

List<int> data = new List<int>
{
    120183,
    105169,
    58942
};
int result = 0;
int calc(int a) => result += a;
foreach(int m in data)
{
    int res = m;
    while ((res / 3) - 2 > 0)
    {
        calc(res = res / 3 - 2);
    }
}
Console.WriteLine($"{result}");
列表数据=新列表
{
120183,
105169,
58942
};
int结果=0;
int calc(int a)=>结果+=a;
foreach(数据中的int m)
{
int res=m;
而((res/3)-2>0)
{
计算(res=res/3-2);
}
}
WriteLine($“{result}”);
现在我想做同样的事情,但是一个表情体成员内。 我认为这些版本应该相互等效。我错过了什么

List<int> data = new List<int>
{
    120183,
    105169,
    58942
};

int result = 0;
int calc(int a) => result += (a / 3 - 2) > 0 ? calc(a = a / 3 - 2) : 0;
data.ForEach(x => calc(x));

Console.WriteLine($"{result}");
列表数据=新列表
{
120183,
105169,
58942
};
int结果=0;
整数计算(整数a)=>结果+=(a/3-2)>0?计算(a=a/3-2):0;
ForEach(x=>calc(x));
WriteLine($“{result}”);

递归实现中的问题是,它实际上从未向
结果添加非零值。每当
(a/3-2)
大于0时,传递给
calc
的值减小到小于或等于0时,将使用新值
(a/3-2)
递归调用calc,返回值0,父调用将其添加到
result
,然后将
result
的新值返回给父调用。因此,最终结果就是
result+=(result+=(result+=(result+=0))

如果要为
calc
使用表达式体函数,而不是在calc中指定结果,请声明一个仅执行计算的calc版本:

int calc(int a) => (a / 3 - 2) > 0 ? ((a / 3 - 2) + calc(a / 3 - 2)) : 0;
然后在您的
ForEach
功能中执行分配:

data.ForEach(x => { result += calc(x) });

查看
calc
返回的内容。在第二种情况下,它返回
calc(a=a/3-2)
0
。对
calc
的后续调用会产生相同的结果,这意味着它的计算结果不定期地为0<代码>计算
然后可以简化为
int-calc(int-a)=>result+=0

这应该会产生正确的结果

int calc(int a) 
{
    if ((a / 3 - 2) > 0)
    {
        result += (a / 3 - 2);
        return calc(a = a / 3 - 2);
    }
    return 0;
};

他想要表达谢谢你!很好的解释!