2017-04-21 21 views
6

जंग के आसन्न तत्वों पर पुनरावृत्ति करते समय लूप से कैसे बचें, इन लूप को लिखने से मैं कैसे बचूं? कोड एक वेक्टर लेता है और उत्पाद के लिए तीन आसन्न तत्वों को गुणा करता है। इसलिए, बाहरी पाश उन सभी तत्वों पर चला जाता है जो तीन के समूह का निर्माण कर सकते हैं और आंतरिक पाश गुणा करता है।एक वेक्टर

कठिनाई झूठ है, मुझे लगता है कि बाहरी पाश के अपूर्ण पुनरावृत्ति में (तत्व 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

अभी, सभी गणना 'उत्पाद की छोड़ दिए जाते हैं और कुछ भी नहीं: बजाय वेक्टर में सभी नंबरों को लिखने के लिए मैन्युअल रूप से आप इस बजाय लिख सकता है हो जाता। क्या आप उन सभी उत्पादों को वेक्टर में एकत्र करना चाहते हैं या आप उनके साथ क्या करना चाहते हैं? –

+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();