2017-06-14 56 views
1

我很努力地找到一種方法,從矢量的末尾取兩個值,然後求和這些值,並將總和推到矢量上。返回Rust中的最後n個元素,無需變換矢量

我發現pop,truncatedrain不起作用,因爲它們會從原始向量中刪除值。

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); 
    } 
} 
+2

'pop'刪除最後一個,使用'last'通過引用訪問它而不刪除它。 – Boiethios

+0

@Boiethios最後沒有參數,但是,對嗎?如果我可以叫'blahblah.last(2)'得到最後兩個完美的東西。 –

+0

這是一個小建議。查看Shepmaster的答案。 – Boiethios

回答

4

你需要考慮在哪裏矢量沒有兩個項目的情況。

我會使用迭代器適配器像Iterator::revIterator::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元這將恐慌,但是。

你可以嘗試處理矢量是在這種情況下太短,但它不漂亮:

let len = stored_nums.len(); 

let idx_a = len.checked_sub(1); 
let idx_b = len.checked_sub(2); 

let a = idx_a.and_then(|idx| stored_nums.get(idx).cloned()); 
let b = idx_b.and_then(|idx| stored_nums.get(idx).cloned()); 

let sum = a.unwrap_or(0) + b.unwrap_or(0); 

stored_nums.push(sum); 

注意,這可能是更好的使用斐波納契迭代器,只是collect到這一個Vec

+1

迭代器是要走的路。謝謝。因爲我用兩個項目預先填充了vec,所以我不擔心可能沒有兩個項目的情況。我也把我的整數類型改爲u64,因爲u32在序列中排在第50位。 –

1

您可以在Vec使用一個反向迭代:

let (n1, n2) = { 
    let mut rev_iter = stored_nums.iter().rev(); 
    (rev_iter.next().unwrap().clone(), rev_iter.next().unwrap().clone()) 
}; 
stored_nums.push(n1 + n2); 
+0

第一次迭代器返回'None'後調用'next'的行爲是未定義的。這個答案多次調用'next' *而不檢查前面的每個是否爲'None',因此可能導致意想不到的結果。 – Shepmaster

+0

@Shepmaster我知道。矢量的長度不會小於2,我只會調用'next' 2次,所以沒有問題。 – Boiethios

+0

提供的* example *永遠不會低於2個元素,但* question *比示例更普遍。 – Shepmaster

相關問題