我正在努力寻找一种方法来从向量的末尾获取两个值,对这些值求和,然后将总和插入向量。
我发现 pop
、truncate
和 drain
不起作用,因为它们从原始向量中删除了值。
fn main() {
println!("Which Fibonacci number would you like to find?");
let mut fib_num = String::new();
io::stdin().read_line(&mut fib_num)
.expect("Failed to read line");
let fib_num: u32 = fib_num.trim().parse()
.expect("Please enter a number");
let mut stored_nums: Vec<u32> = vec![0, 1];
while fib_num > stored_nums.len() as u32 {
let mut limit = stored_nums.len();
let mut new_num1 = stored_nums.pop().unwrap();
let mut new_num2 = stored_nums.pop().unwrap_or(0);
stored_nums.push(new_num1 + new_num2);
}
}
最佳答案
您需要考虑向量没有两个项的情况。
我会使用像 Iterator::rev
这样的迭代器适配器和 Iterator::take
然后以 Iterator::sum
结束:
let sum = stored_nums.iter().rev().take(2).sum();
stored_nums.push(sum);
这使您可以避免显式处理向量/切片/迭代器太短但代码仍然隐式处理的情况。
你也可以直接索引切片:
let len = stored_nums.len();
let sum = stored_nums[len - 1] + stored_nums[len - 2];
stored_nums.push(sum);
但是,如果元素少于 2 个,这将 panic。
在这种情况下,您可以尝试处理向量太短的问题,但这有点冗长:
fn add_last_two(nums: &[u32]) -> Option<u32> {
let len = nums.len();
let idx_a = len.checked_sub(1)?;
let idx_b = len.checked_sub(2)?;
let a = nums.get(idx_a)?;
let b = nums.get(idx_b)?;
Some(a + b)
}
fn main() {
let mut stored_nums: Vec<u32> = vec![0, 1];
let sum = add_last_two(&stored_nums).unwrap_or(0);
stored_nums.push(sum);
}
请注意,使用 a Fibonacci iterator 可能会更好并将其收集
到Vec
中。
关于vector - 在不改变向量的情况下返回 Rust 中向量的最后 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549759/