Collatz Conjecture
1. Readme
考拉兹猜想
在 考拉兹猜想 或 3n+1 猜想 可以如下:
是指对于每一个正整数,如果它是奇数,则对它乘 3 再加 1,如果它是偶数,则对它除以 2,如此循环,最终都能够得到 1。
给予一个数字n
,那它到达 1 的步骤.
例子
如 n = 12
,步骤如下:将
- 12
- 6
- 3
- 10
- 5
- 16
- 8
- 4
- 2
- 1
9 步骤。系统的输入是n = 12
,返回值将是9
资源
以数学家 Lothar Collatz 命名的一个未解决的数学问题https://en.wikipedia.org/wiki/3x_%2B_1_problem
2. 开始你的表演
pub fn collatz(n: u64) -> Option<u64> { unimplemented!( "return Some(x) where x is the number of steps required to reach 1 starting with {}", n, ) }
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn test_1() { assert_eq!(Some(0), collatz(1)); } #[test] //#[ignore] fn test_16() { assert_eq!(Some(4), collatz(16)); } #[test] //#[ignore] fn test_12() { assert_eq!(Some(9), collatz(12)); } #[test] //#[ignore] fn test_1000000() { assert_eq!(Some(152), collatz(1000000)); } #[test] //#[ignore] fn test_0() { assert_eq!(None, collatz(0)); } #}
4. 答案
# #![allow(unused_variables)] #fn main() { pub fn collatz_positive(n: u64) -> u64 { if n == 1 { 0 } else { 1 + match n % 2 { 0 => collatz_positive(n / 2), _ => collatz_positive(n * 3 + 1), } } } // return Ok(x) where x is the number of steps required to reach 1 pub fn collatz(n: u64) -> Option<u64> { if n < 1 { None } else { Some(collatz_positive(n)) } } #}