Одного вечора ми натрапили на старий зошит, сповнений загадкових карлючок, ніби хтось одержимо гнався за якоюсь ідеєю. На одній сторінці виділялося єдине питання: Чи може кожне число знайти свій шлях до 1? Воно було повʼязане з чимось, що зветься гіпотеза Коллатца, головоломкою, яка спантеличує мислителів уже десятиліттями.
Правила були оманливо простими. Візьмімо будь-яке додатне ціле число.
Потім повторімо ці кроки з результатом і так до нескінченності.
Зацікавившись, ми взяли число 12 для перевірки й почали подорож:
12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1
Рахуючи від другого числа (6), знадобилося 9 кроків, щоб дістатися до 1, і щоразу, коли правила повторювалися, число продовжувало змінюватися. Спершу послідовність здавалася непередбачуваною, вона стрибала вгору, вниз і в різні боки. І все ж гіпотеза стверджує, що хоч би яким було початкове число, ми завжди закінчимо на 1.
Це було захопливо, але й загадково. Чому це завжди, здається, працює? Чи існує число, на якому процес ламається, зациклюється назавжди або тікає в нескінченність? Зошит натякав, що розвʼязання цього може відкрити щось глибоке, а разом із ним на того, хто зможе розкрити його таємниці, чекають слава, багатство і місце в історії.
Дано додатне ціле число. Поверніть кількість кроків, потрібних для досягнення 1 за правилами гіпотези Коллатца.
Іноді виникає потреба викликати виняток. Роблячи це, завжди додавайте змістовне повідомлення про помилку, яке вказує, що стало джерелом помилки. Так код стає зрозумілішим, і це суттєво допомагає під час налагодження. Якщо відомо, що джерело помилки має певний тип, можна викликати один із вбудованих типів помилок, але змістовне повідомлення все одно має бути.
Гіпотеза Коллатца стосується лише строго додатних цілих чисел, тому в цій вправі треба використати інструкцію raise і «кинути» ValueError у своєму рішенні, якщо задане значення дорівнює нулю або є відʼємним цілим числом. Тести пройдуть лише тоді, коли і викликати exception, і додати до нього повідомлення.
Щоб викликати ValueError з повідомленням, передайте повідомлення як аргумент типу exception:
# example when argument is zero or a negative integer
raise ValueError("Only positive integers are allowed")
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.