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

Rust斐波那契数列实现问题:结果偏差的原因及解惑

斐波那契数列代码逻辑问题解析

代码片段

pub fn fibonacci() {
    println!("Please enter the number");
    let mut n1 = 0;
    let mut n2 = 1;
    let mut n3 = 0;
    let mut number = String::new();
    std::io::stdin().read_line(&mut number).expect("Failed to read line");
    let number: u32 = number.trim().parse().expect("Please enter a valid number");

    println!("The number is {}", number);

    let mut count = number - 2;
    println!("The fibonacci number is {}", n1);
    println!("The fibonacci number is {}", n2);
    while count != 0 {
        n3 = n1 + n2;
        n1 = n2;
        n2 = n3;

        count -= 1;
        // println!("The fibonacci number is {}", n3);
    }
    println!("The fibonacci number is {}", n3);
}

问题说明

输入数字6时,期望得到第6位斐波那契数8,但实际输出为5。将count设为number-1可得到正确结果,需解析代码问题及原理。

问题解析

1. 初始值对应的数列位置

代码里的初始变量对应斐波那契数列的前两项:

  • n1=0 → 数列索引0的项
  • n2=1 → 数列索引1的项

2. 循环次数的逻辑偏差

每一次循环会生成数列的下一项:

  • 第1次循环:生成索引2的项(值1)
  • 第2次循环:生成索引3的项(值2)
  • 第3次循环:生成索引4的项(值3)
  • 第4次循环:生成索引5的项(值5)

当输入number=6,设置count=number-2时,循环次数为4次,最终得到的是索引5的项(值5),但你期望的是索引6的项(值8)。要得到索引6的项,需要从初始的索引1再生成5个新项,也就是循环5次,对应count=number-1(6-1=5)。第5次循环时:n3=3+5=8,正好是你期望的结果。

3. 本质逻辑

循环次数 = 目标项的索引 - 初始最大索引(1)。如果目标是索引为number的项,循环次数就是number-1;之前的number-2少循环了一次,因此停在了目标项的前一项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:17:41