Collatz Conjecture

1. Readme

考拉兹猜想

在 考拉兹猜想 或 3n+1 猜想 可以如下:

是指对于每一个正整数,如果它是奇数,则对它乘 3 再加 1,如果它是偶数,则对它除以 2,如此循环,最终都能够得到 1。

给予一个数字n,那它到达 1 的步骤.

例子

n = 12,步骤如下:将

  1. 12
  2. 6
  3. 3
  4. 10
  5. 5
  6. 16
  7. 8
  8. 4
  9. 2
  10. 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))
   }
}

#}



填充/相关