[炼手Rust]考拉兹猜想

244 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天一起来看一个著名的数学猜想:考拉兹猜想。

featured-image-collatz-harriss-e1588439815159.webp

提问

1937 年Lothar Collatz提出这样一个猜想:对于任何一个正整数 N,如果 N 是偶数,就将它除以 2;如果 N 是奇数,就将它乘以 3 再加 1。经过若干次迭代后,最终 N 将变为 1。如果读者有人能证明这个才行,恭喜你,你将可以获得100万美金。这里我们不证明这个猜想(毕竟真没有这金刚钻)。现在,给你一个整数 N,请返回,要经过多少步,才能将 N 变为 1。

例:
N = 4, 按照考拉兹变换,4,2,1,所以返回 2。
N = 12,12,6,3,10,5,16,8,4,2,1,返回 9。
N = 1,返回 0。
N = 0,返回 None。

模板:

pub fn collatz(n: u64) -> Option<u64> { }

分析

题设本身非常简单,我们可以通过while循环,判断 N 是否是偶数,如果是偶数,就除以 2,如果是奇数,就乘以 3 加上 1,直到 N 为 1 为止,退出循环。

解决方案

pub fn collatz(n: u64) -> Option<u64> {

    if n == 0 {
        return None;
    }

    let mut n = n;
    let mut step = 0;
    while n != 1 {
        if n & 1 == 1 {
          n = n * 3 + 1;  
        } else {
          n = n >> 1;
        }
        step += 1;
    }
    
    Some(step)
}

Trick:

  1. rust中的判断条件,和其他语言不一样的地方是,不用加括号。
  2. 采用位运算判断奇偶性。
  3. let mut n = n,此处使用了rust中,shadowing的特性。