gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:26:30 26 4
gpt4 key购买 nike

我认为这种递归模式实现起来会很巧妙,但我很难做到。是否有可能以某种方式在表达式主体成员中重新分配传递的参数?我认为这是我在这里遇到的限制。根据 EBM 上的 MSDN,它说:

Only assignment, call, increment, decrement, and new object expression can be used as a statement

我正在履行,所以我不确定为什么这不起作用。

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

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}");

现在我想做同样的事情,但是一个表达式主体成员中。我认为这些版本应该是等价的。我错过了什么?

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}");

最佳答案

递归实现中的问题是它实际上从未将非零值添加到result。每当 (a/3 - 2) 大于 0 时,一旦将值传递给 ,就会使用新值 (a/3 - 2) 递归调用 calc calc 递减为小于或等于 0 返回值 0,父调用将其添加到 result 并随后返回 result 的新值给 parent 。所以最终结果就是 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) });

关于c# - 在表达式主体成员中使用重新分配的参数进行递归调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59165940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com