Решение
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
/// Определяет длину последовательности Коллатца, начинающейся с `n`.
fn collatz_length(mut n: i32) -> u32 {
let mut len = 1;
while n > 1 {
n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 };
len += 1;
}
len
}
fn main() {
println!("Length: {}", collatz_length(11)); // должно быть 15
}
Это решение демонстрирует несколько ключевых возможностей Rust:
- Аргументы
mut: аргументnобъявлен какmut n. Это делает локальную переменнуюnизменяемой в области видимости функции. Это не влияет на значение у вызывающего кода, так как целые — типыCopy, которые передаются по значению. - Выражения
if:ifв Rust — это выражение, то есть оно порождает значение. Мы присваиваем результат блокаif/elseнапрямуюn. Это короче, чем писатьn = ...внутри каждой ветви. - Неявный возврат: функция заканчивается на
len(без точки с запятой), и это значение автоматически возвращается.
- Обратите внимание, что для корректности последовательности Коллатца
nдолжно быть строго больше 0. Функция принимаетi32, но в постановке задачи подразумеваются положительные целые. Более надёжная реализация могла бы использоватьu32или возвращатьOptionилиResultдля обработки некорректных входных данных (0 или отрицательных чисел). Но приn <= 0возможны паника или бесконечный цикл. - Переполнение — возможная проблема, если
nстановится слишком большим, как и в упражнении с Фибоначчи.