gpt4 book ai didi

C# 使用 LINQ 限制递归列表

转载 作者:太空狗 更新时间:2023-10-30 00:32:48 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用 LINQ 来限制递归调用。

我对以下代码的意图是遍历数字列表 (num) 并针对每个数字递归计数/打印到设定数量 (6) .

我要获取的 newnum 中的序列是:3 45个1个2个3个4个5个5个2个3个4个5

但我自然而然地陷入了无限循环。 .Where 谓词没有像我想的那样停止循环,很可能我的基本情况已关闭。关于设置它的正确方法的任何见解?谢谢。

var num = new[] {3, 1, 8, 5, 2};

Func<int, int> writeString = delegate(int count)
{
Func<int, int> recursiveWrite = null;
recursiveWrite = n =>
{
Console.WriteLine("string " + n);

recursiveWrite(n+1);
return n;
};
return recursiveWrite(count);
};

var newnum = num.Where(n => writeString(n) < 6); // is this possible?
newnum.ToList().ForEach( w => Console.WriteLine(w));

我注意到在下面的示例代码中出现了类似的停止模式,.Where 将只包含小于 7 的阶乘,我错过了什么?

var numbers = new[] { 5,1,3,7,2,6,4};

Func<int, int> factorial = delegate(int num) {
Func<int, int> locFactorial = null;
locFactorial = n => n == 1 ? 1 : n * locFactorial(n - 1);
return locFactorial(num);
};

var smallnums = numbers.Where(n => factorial(n) < 7);

最佳答案

答案是您没有基本情况。一旦执行了递归函数,就没有什么可以阻止它了——LINQ 不会执行任何可以修改另一个函数的内部逻辑的魔法。

在示例中,您缺少将停止递归的关键代码位 - 基本情况:

locFactorial = n => n == 1 ? 1 : n * locFactorial(n - 1);

三元运算符检查是否 n==1 - 如果是,它返回 1。这是您的函数缺少的基本情况。

无法单独通过 LINQ 为您的函数提供基本情况。您需要将其构建到递归函数中。

此外,如果您想从单个数字返回一个数字列表,您将从递归函数返回错误的类型:这与 Factorial 根本不同。给定单个数字返回单个数字的函数。

这是一个不使用递归就可以完成你所需要的功能:

void Main()
{
var numbers = new[] {3, 1, 8, 5, 2};

numbers.SelectMany(x => GetIncreasing(x).TakeWhile(y => y < 6));
}

IEnumerable<int> GetIncreasing(int x)
{
while (true)
yield return x++;
}

关于C# 使用 LINQ 限制递归列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15406203/

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