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
相关产品推荐
相关产品推荐

