Этот мини-проект создавался, чтобы немного попрактиковаться в написании простых макросов и итераторов. Особой практической ценности в нём нет, поэтому проект перенесён в архив и оставлен как пример моего мышления и подхода к написанию кода.
- Задано натуральное число
N. - Если
N- чётное, тоN = N / 2; - Если
N- нечётное, тоN = 3 * N + 1; - Вернуться к шагу 1.
Гипотеза гласит, что все числа сводятся к циклу 4 -> 2 -> 1.
Или, иными словами, гипотеза заключается в том, что какое бы начальное число N мы ни взяли,
рано или поздно мы получим единицу.
Доказать или опровергнуть математики на данный момент эту гипотезу не могут.
Я ничего доказывать тоже не буду, ибо не математик, а просто сделаю простенький итератор на Rust,
который будет инициализироваться числом N и возвращать следующий элемент, согласно заданным условиям.
В качестве Item у итератора - Result.
Итератор CollatzIterator реализован для всех NonZero-версий примитивных целых чисел, включая знаковые.
При этом работа с отрицательными числами не рассматривается. Попытка инициализировать итератор отрицательным числом приведёт к возврату из итератора ошибки.
В случае переполнения числа итератор возвращается ошибку.
Итерирование прекращается (next() возвращает None) либо после достижения 1, либо после ошибки.
Работать с числами больше 2^128 не получится.
Licensed under either of
- Apache License, Version 2.0 (LICENSE.Apache-2.0.md or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE.MIT.md or http://opensource.org/licenses/MIT)
at your option.
SPDX-License-Identifier: MIT OR Apache-2.0