2017-04-21 18 views
6

これらのループを書くにはどうしたらよいですか?コードはベクトルをとり、隣接する3つの要素に積を掛けます。したがって、外側のループは、3つのグループを形成することができるすべての要素を超え、内側のループは乗算を行います。ベクトルの隣接要素を反復処理するときにループを回避する方法

外部ループ(要素0からlast - 3まで)の不完全な反復では、難しいと思います。さらに、内部ループは部分範囲を使用しなければならない。

ループの作成を避ける方法はありますか?

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let mut products = Vec::new(); 
for seq in 0..v.len() - 3 { 
    let mut product = 1; 
    for offset in 0..3 { 
     product *= v[seq + offset]; 
    } 
    products.push(product); 
} 
+0

を今、すべての計算 'product'sは本当に捨てていないと何もされています起こるこれらの製品をベクターに集めたいのですか、それとも何をしたいのですか? –

+0

あなたは正しいです。私の元のコードを上記の例にカットすると、それは失われました。私は編集をしました。 – dani

答えて

8

検索対象の機能は[T]::windows()です。オーバーラップするウィンドウのサイズを指定すると、サブスライス上のイテレータが返されます。

サブスライス内のすべての要素の積を得るには、反復子を作成してIterator::product()を使用します。

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let products: Vec<u64> = v.windows(3) 
    .map(|win| win.iter().product()) 
    .collect(); 

Playground

ここでは、新しいベクターにすべての製品を収集します。


最後の音符:代わりにあなたが手動ベクトル内のすべての数字を書き留めるの代わりにこれを書くことができます:

let v: Vec<_> = (1..10).chain(1..10).collect(); 
関連する問題