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}"); }
修正说明
- 简化变量:去掉冗余的
sum和初始next,只保留prev和current记录相邻两项 - 调整循环逻辑:从第3项开始循环
n-2次,每次计算新项时先保存当前current到prev,再更新current为两者之和,符合斐波那契数列的定义 - 清理多余分支判断,让代码逻辑更简洁直观
内容的提问来源于stack exchange,提问作者user22699933
相关产品推荐
相关产品推荐

