【发布时间】:2017-04-01 23:39:46
【问题描述】:
我正在尝试编写一个生成lucky numbers 的函数,
static IEnumerable<int> LuckyNumbers()
{
IEnumerable<int> luckyNumbers = Enumerable.Range(1, int.MaxValue);
int counter = 1;
while (true)
{
int number = luckyNumbers.ElementAt(counter++);
yield return number;
luckyNumbers = luckyNumbers.Where((_, index) => (index + 1) % number != 0);
}
}
但这会产生:
2,5,7,11,13,17,21,...
这不是幸运数字。
为什么我的代码不起作用?我正在尝试:
-
从所有自然数开始:
IEnumerable<int> luckyNumbers = Enumerable.Range(1, int.MaxValue); int counter = 1; -
遍历它们并返回下一个幸运数字:
while (true) { int number = luckyNumbers.ElementAt(counter++); yield return number; -
从序列中删除所有
nth 数字:luckyNumbers = luckyNumbers.Where((_, index) => (index + 1) % number != 0);
我不明白为什么这不能按我的意愿工作。
【问题讨论】:
-
请记住,每次执行第 3 步时,您都会得到一个新序列。现在,您确定要从该新序列中获得元素
counter吗?尝试在一张纸上完成所有内容... -
@JonSkeet 我很确定,我想我应该每次都从上一代序列中提取下一个元素。但我可以在纸上试一试。
-
鉴于维基百科有一个工作示例,我建议您在调试时遵循该示例。我注意到的第一个问题是你从第二个元素开始,因为你有
counter = 1而不是counter = 0。这意味着你永远不会返回 1,这是一个幸运数字。 -
算法有点奇怪。对于第一个数字,采用
1并删除每个2nd元素。对于所有以下数字,所采取的数字和朝向下一个擦除数字的步数相等。所以我猜你必须在进入实际的重新出现算法表单之前专门处理1。
标签: c# iteration generator sequences