Этот мини-проект создавался, чтобы немного попрактиковаться в написании простых макросов и итераторов. Особой практической ценности в нём нет, поэтому проект перенесён в архив и оставлен как пример моего мышления и подхода к написанию кода.
- Задано натуральное число
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