Я пытаюсь написать функцию, которая генерирует 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;
демонтировать все
n
го числа из следующей последовательности:luckyNumbers = luckyNumbers.Where((_, index) => (index + 1) % number != 0);
Я не понимаю, почему это не работает, как я предполагаю.
Помните, что каждый раз, когда вы выполняете шаг 3, вы получаете новую последовательность. Теперь вы уверены, что хотите, чтобы элемент 'counter' из этой новой последовательности? Попробуйте просмотреть все это на листе бумаги ... –
@JonSkeet Я уверен, я думал, что я должен каждый раз брать следующий элемент из предыдущего поколения. Но я могу попробовать это на бумаге. – theonlygusti
Учитывая, что wikipedia имеет обработанный пример, я предлагаю вам следовать этому при отладке. Первая проблема. Я отмечаю, что вы начинаете со второго элемента, потому что у вас есть 'counter = 1', а не' counter = 0'. Это означает, что вы никогда не вернетесь 1, что означает счастливое число. –