Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Решение

// 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 становится слишком большим, как и в упражнении с Фибоначчи.