Rust 中的 dirct 乘法和递归有什么区别

  • 本文关键字:区别 递归 中的 dirct Rust rust
  • 更新时间 :
  • 英文 :


我是 rust 的新手,我正在尝试解决这个 leetcode 问题,我写了以下代码片段

fn main() {
println!("{}", Solution::my_pow(0.00001, 2147483647))
}
struct Solution {}
impl Solution {
pub fn my_pow(x: f64, n: i32) -> f64 {
let mut base = x;
let mut exp = n;
let mut res = 1.0;
if n < 0 {
base = 1.0 / base;
exp = -n;
}
let mut i = 1;
while exp != 0 {
let mut temp = base;
while i * 2 <= exp {
temp *= temp;
i *= 2;
}
res *= temp;
exp -= i;
i = 1;
}
res
}
}

当我运行代码时,它惊慌失措并打印一条错误消息说thread 'main' panicked at 'attempt to multiply with overflow', src/main.rs:19:19,但以下代码片段

impl Solution {
pub fn my_pow(x: f64, n: i32) -> f64 {
fn pow(x: f64, res: f64, n: i64) -> f64 {
match n {
0 => res,
n if n & 1 == 1 => pow(x*x, res*x, n>>1),
_ => pow(x*x, res, n>>1)
}
}
match n {
0 => 1.0,
n if n < 0 => pow(1.0/x, 1.0, (n as i64).abs()),
_ => pow(x, 1.0, n as i64)
}
}
}

可以按预期运行。我很困惑。两个代码片段之间有什么区别?

两个代码片段有什么区别?

其中一个溢出,另一个没有。您是否考虑过阅读错误消息并想知道它与您的代码有何关系?恐慌指向:

while i * 2 <= exp {

您在定义i时未指定其类型,这意味着它是一个i32(32b 有符号整数,二进制补码)。你一直把它乘以 2,所以除了它的初始值之外,它只能是偶数,你这样做直到它大于最初nexp因此2147483647

大于2147483647的偶数是2147483648,这不是有效的 i32,因此它会溢出。这就是恐慌告诉你的。

最新更新