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

Rust实现斐波那契数列异常:求第n项却返回2的n次方

Rust斐波那契数列实现错误:返回2ⁿ而非正确值

尝试用Rust实现斐波那契数列求解功能,但出现异常:每次获取第n个斐波那契数时,程序总是返回2的n次方结果。以下是原代码:

use std::io;
// Fibonacci Series Number
// F(n) = 1,1,2,3,5,8,13,....(n-1),((n-1)+n)
// where, n >= 0

fn fibo(mut n: u32) -> u32 {
    let mut _prev: u32 = 0;
    let mut current: u32 = 1;
    let mut next: u32 = 1;
    let mut sum: u32 = 1;
    if n <= 0 {
        return 0;
    }
    if n == 1 || n == 2 {
        return 1;
    };
    if n > 2 {
        while n >= 1 {
            current = next;
            _prev = current;
            sum = _prev + current;
            next = sum;
            n -= 1;
        }
        next
    } else {
        return 1;
    }
}

fn main() {
    println!("Fibo of nth: What is nth?: n --> ");
    let mut n = String::new();
    io::stdin().read_line(&mut n).expect("Invalid input");
    let n: u32 = n
        .trim()
        .parse()
        .expect("Not a number. Please type a number");
    let fibo = fibo(n);
    println!("Fibo of {n}: {fibo}");
}

错误原因分析

核心问题出在循环内的变量赋值逻辑:

  • current = next; 把current更新为当前的next值
  • 紧接着 _prev = current; 又把_prev设成了和current完全相同的值
  • 这导致 sum = _prev + current 等价于 sum = current * 2,每次循环next都会翻倍,最终结果自然变成2的n次方。

另外,循环的终止条件也不合理:当n>2时,循环从n开始递减到1,执行次数过多,正确的应该是从第3项开始循环n-2次。

修正后的代码

use std::io;

fn fibo(mut n: u32) -> u32 {
    if n <= 0 {
        return 0;
    }
    if n == 1 || n == 2 {
        return 1;
    }
    // 初始化前两项
    let mut prev = 1;
    let mut current = 1;
    // 从第3项开始,循环n-2次计算后续项
    for _ in 3..=n {
        let next_val = prev + current;
        prev = current;
        current = next_val;
    }
    current
}

fn main() {
    println!("Fibo of nth: What is nth?: n --> ");
    let mut n = String::new();
    io::stdin().read_line(&mut n).expect("Invalid input");
    let n: u32 = n
        .trim()
        .parse()
        .expect("Not a number. Please type a number");
    let result = fibo(n);
    println!("Fibo of {n}: {result}");
}

修正说明

  1. 简化变量:去掉冗余的sum和初始next,只保留prev和current记录相邻两项
  2. 调整循环逻辑:从第3项开始循环n-2次,每次计算新项时先保存当前current到prev,再更新current为两者之和,符合斐波那契数列的定义
  3. 清理多余分支判断,让代码逻辑更简洁直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:47:37