Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天一起来看一个著名的数学猜想:考拉兹猜想。
提问
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:
rust中的判断条件,和其他语言不一样的地方是,不用加括号。- 采用位运算判断奇偶性。
let mut n = n,此处使用了rust中,shadowing的特性。