Open
Description
The first suggestion is that the Collatz Sequence is only valid when n
is in the set of natural numbers. Thus the input parameter n
into the collatz_length
function should be u32
and not i32
- especially since the output is u32
- thus no need for unnecessary casting.
The second suggestion is that I propose a solution that matches the official sequence, which only counts the number of tripling and halving operations. i.e.:
n | length |
---|---|
1 | 0 |
2 | 1 |
3 | 7 |
The On-line Encyclopedia of Integer Sequences (OEIS) for the Collatz conjecture, A006577 - "Number of halving and tripling steps to reach 1 in '3x+1' problem, or -1 if 1 is never reached.":
OEIS - A006577 as a simple table.
A possible solution is:
/// Determine the length of the Collatz sequence.
///
/// We are defining the length of the Collatz sequence as the number of halving
/// and tripling steps to the end of the collatz sequence (n == 1) beginning at
/// `n`. This function will just return `0` for the invalid input `n == 0`
/// instead of returning an error as we have not yet covered that in this
/// course.
///
/// More info: https://en.wikipedia.org/wiki/Collatz_conjecture
/// This follows the pattern from: https://oeis.org/A006577/list
pub fn collatz_length(mut n: u32) -> u32 {
let mut counter = 0_u32;
while n > 1 {
n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 };
counter += 1;
}
counter
}
#[test]
fn test_collatz_length() {
assert_eq!(collatz_length(0), 0);
assert_eq!(collatz_length(1), 0);
assert_eq!(collatz_length(2), 1);
assert_eq!(collatz_length(11), 14);
assert_eq!(collatz_length(27), 111);
assert_eq!(collatz_length(837799), 524);
}
fn main() {
println!("Length: {}", collatz_length(11));
}
Metadata
Metadata
Assignees
Labels
No labels
Activity