You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust递归程序出现“attempt to add with overflow”溢出错误排查求助

解决Rust递归中整数溢出的Panic问题

咱们先把你遇到的attempt to add with overflow panic的根源搞清楚:

问题核心:i8类型的取值范围不够用

你用的i8是有符号8位整数,它的取值上限只有127,下限是-128。而你的递归函数计算的是「每次走1、2、3步,爬n阶楼梯的方法数」,这个数值增长速度远超你想象:
咱们手动算几个值就能直观看到:

  • ways_to_climb(7) = 44
  • ways_to_climb(8) = 81
  • ways_to_climb(9) = 149 → 这里已经超过了i8的最大值127
  • ways_to_climb(10) = 149 + 81 + 44 = 274 → 完全超出i8的取值范围

在Rust的Debug模式下,整数溢出会触发panic(这是Rust的安全机制,避免你拿到错误的计算结果),所以当递归计算到ways_to_climb(9)时,结果已经突破i8上限,后续的加法操作直接触发了panic。

最简单的解决方案:换用更大的整数类型

只需要把函数的参数和返回值类型换成i16、i32这类更大的整数类型,就能解决问题。比如改成i32:

fn main() {
    let num = ways_to_climb(10);
    println!("{}", num);
}

fn ways_to_climb(n: i32) -> i32 {
    println!("{}", n);
    if n == 0 || n == 1 {
        return 1;
    }
    if n < 0 {
        return 0;
    }
    ways_to_climb(n - 1) + ways_to_climb(n - 2) + ways_to_climb(n - 3)
}

运行这段代码就能得到正确结果274,不会再出现溢出panic。

额外小提示:关于Rust的整数溢出行为

  • Debug模式:默认会严格检查溢出,触发panic(也就是你遇到的情况)
  • Release模式:会自动执行「环绕溢出」(比如i8的127+1会变成-128),但这会导致计算结果完全错误,绝对不建议依赖这个行为

如果以后需要在特定场景下处理溢出(比如允许环绕或截断),可以用Rust标准库提供的wrapping_add、checked_add等方法,但在你的这个问题里,换用更大的整数类型是最直接且正确的选择。

内容的提问来源于stack exchange,提问作者Pr00grammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:52:43