Skip to content

Commit 5f05448

Browse files
authored
Add collatz_sequence.rs (TheAlgorithms#402)
1 parent 75fcde9 commit 5f05448

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/math/collatz_sequence.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// collatz conjecture : https://en.wikipedia.org/wiki/Collatz_conjecture
2+
pub fn sequence(mut n: usize) -> Option<Vec<usize>> {
3+
if n == 0 {
4+
return None;
5+
}
6+
let mut list: Vec<usize> = vec![];
7+
while n != 1 {
8+
list.push(n);
9+
if n % 2 == 0 {
10+
n /= 2;
11+
} else {
12+
n = 3 * n + 1;
13+
}
14+
}
15+
list.push(n);
16+
Some(list)
17+
}
18+
19+
#[cfg(test)]
20+
mod tests {
21+
use super::sequence;
22+
23+
#[test]
24+
fn validity_check() {
25+
assert_eq!(sequence(10).unwrap(), [10, 5, 16, 8, 4, 2, 1]);
26+
assert_eq!(
27+
sequence(15).unwrap(),
28+
[15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
29+
);
30+
assert_eq!(sequence(0).unwrap_or_else(|| vec![0]), [0]);
31+
}
32+
}

src/math/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod amicable_numbers;
22
mod armstrong_number;
33
mod baby_step_giant_step;
44
mod chinese_remainder_theorem;
5+
mod collatz_sequence;
56
mod doomsday;
67
mod extended_euclidean_algorithm;
78
mod fast_fourier_transform;
@@ -37,6 +38,7 @@ pub use self::amicable_numbers::amicable_pairs_under_n;
3738
pub use self::armstrong_number::is_armstrong_number;
3839
pub use self::baby_step_giant_step::baby_step_giant_step;
3940
pub use self::chinese_remainder_theorem::chinese_remainder_theorem;
41+
pub use self::collatz_sequence::sequence;
4042
pub use self::doomsday::get_week_day;
4143
pub use self::extended_euclidean_algorithm::extended_euclidean_algorithm;
4244
pub use self::fast_fourier_transform::{

0 commit comments

Comments
 (0)