में बंद और जीवनकाल के साथ संघर्ष करना मैं एफ # से जंग से थोड़ा बेंचमार्क बंद करने की कोशिश कर रहा हूं। एफ # कोड इस तरह दिखता है:जंग
let inline iterNeighbors f (i, j) =
f (i-1, j)
f (i+1, j)
f (i, j-1)
f (i, j+1)
let rec nthLoop n (s1: HashSet<_>) (s2: HashSet<_>) =
match n with
| 0 -> s1
| n ->
let s0 = HashSet(HashIdentity.Structural)
let add p =
if not(s1.Contains p || s2.Contains p) then
ignore(s0.Add p)
Seq.iter (fun p -> iterNeighbors add p) s1
nthLoop (n-1) s0 s1
let nth n p =
nthLoop n (HashSet([p], HashIdentity.Structural)) (HashSet(HashIdentity.Structural))
(nth 2000 (0, 0)).Count
यह एक संभावित अनंत ग्राफ में एक प्रारंभिक शिखर से n वें-निकटतम पड़ोसी गोले गणना करता है। मैंने असुरक्षित सामग्री का अध्ययन करने के लिए अपने पीएचडी के दौरान कुछ ऐसा ही इस्तेमाल किया।
मैंने जंग को यह बंद करने की कोशिश करने और विफल होने में कई घंटे बिताए हैं। मैंने एक संस्करण काम करने में कामयाब रहा है, लेकिन केवल बंद करने और स्थानीय म्यूटेबल (युक!) के साथ लूप में रिकर्सन को परिवर्तित करने के द्वारा ही परिवर्तित किया है।
fn iterNeighbors<F>(f: &F, (i, j): (i32, i32)) ->()
where F : Fn((i32, i32)) ->() {
f((i-1, j));
f((i+1, j));
f((i, j-1));
f((i, j+1));
}
मुझे लगता है कि एक समारोह है कि एक बंद स्वीकार करता है और एक जोड़ी और रिटर्न इकाई (जो स्वयं को एक जोड़ी और रिटर्न इकाई स्वीकार करता है) है:
use std::collections::HashSet;
मैं इस तरह iterNeighbors
समारोह लेखन की कोशिश की। मुझे ब्रैकेट चीजों को दोगुना करना प्रतीत होता है: क्या यह सही है?
fn nthLoop(n: i32, s1: HashSet<(i32, i32)>, s2: HashSet<(i32, i32)>) -> HashSet<(i32, i32)> {
if n==0 {
return &s1;
} else {
let mut s0 = HashSet::new();
for &p in s1 {
if !(s1.contains(&p) || s2.contains(&p)) {
s0.insert(p);
}
}
return &nthLoop(n-1, s0, s1);
}
}
ध्यान दें कि मैं भी अभी तक iterNeighbors
करने के लिए कॉल करने की चिंता नहीं है:
मैं इस तरह एक पुनरावर्ती संस्करण लेखन की कोशिश की।
मुझे लगता है कि मैं तर्कों के जीवनकाल को सही करने के लिए संघर्ष कर रहा हूं क्योंकि वे रिकर्सिव कॉल में घूमते हैं। अगर मुझे return
एस से पहले s2
को हटा दिया जाना है, तो मुझे जीवनकाल को एनोटेट करना चाहिए और मुझे s1
वापस आने या रिकर्सिव कॉल में रहने के लिए जीवित रहने के लिए चाहिए?
फोन करने वाले कुछ इस तरह दिखेगा:
fn nth<'a>(n: i32, p: (i32, i32)) -> &'a HashSet<(i32, i32)> {
let s0 = HashSet::new();
let mut s1 = HashSet::new();
s1.insert(p);
return &nthLoop(n, &s1, s0);
}
मैं उस पर छोड़ दिया और बजाय परिवर्तनशील स्थानीय लोगों के साथ while
पाश के रूप में यह लिखा है:
fn nth<'a>(n: i32, p: (i32, i32)) -> HashSet<(i32, i32)> {
let mut n = n;
let mut s0 = HashSet::new();
let mut s1 = HashSet::new();
let mut s2 = HashSet::new();
s1.insert(p);
while n > 0 {
for &p in &s1 {
let add = &|p| {
if !(s1.contains(&p) || s2.contains(&p)) {
s0.insert(p);
}
};
iterNeighbors(&add, p);
}
std::mem::swap(&mut s0, &mut s1);
std::mem::swap(&mut s0, &mut s2);
s0.clear();
n -= 1;
}
return s1;
}
यह काम करता है अगर मैं बंद इनलाइन हाथ से लेकिन मैं यह नहीं समझ सकता कि बंद करने का आह्वान कैसे किया जाए। आदर्श रूप में, मुझे यहां स्थिर प्रेषण चाहिए। ... क्या मैं गलत कर रहा हूँ
fn main() {
let s = nth(2000, (0, 0));
println!("{}", s.len());
}
तो:
main
समारोह तो है? :-)
इसके अलावा, मैंने केवल F12 में HashSet
का उपयोग किया क्योंकि मुझे लगता है कि जंग पूरी तरह से कार्यात्मक Set
को कुशल सेट-सैद्धांतिक संचालन (संघ, चौराहे और अंतर) प्रदान नहीं करता है। क्या मैं इसे मानने में सही हूं?
'drop' है कि वास्तव में समझ में आता है का उपयोग करने का एक दुर्लभ उदाहरण:
यहाँ काम कर कोड है। उत्तेजित करनेवाला! ओपी के लिए, मैं इंगित करता हूं कि विधि/ब्लॉक में अंतिम विवरण के रूप में 'वापसी' होने पर गैर-मूर्खतापूर्ण जंग है; आमतौर पर आप एक अभिव्यक्ति के साथ समाप्त होता है। इसके अतिरिक्त जंग 'snake_case' पहचानकर्ताओं का उपयोग करती है, न कि' camelCase' – Shepmaster
शानदार, दोनों धन्यवाद! :-) –
"हालांकि, हैशसेट सेट-सैद्धांतिक परिचालन को कार्यान्वित करता है। इनका उपयोग करने के दो तरीके हैं: इटरेटर (अंतर, सममित_ डिफिफरेंस, चौराहे, संघ), जो अनुक्रम को आलसी उत्पन्न करते हैं, या ऑपरेटर (|, &, ^, - , जैसा कि हैशसेट के लिए विशेषता कार्यान्वयन में सूचीबद्ध है), जो स्रोत सेट से मूल्यों के क्लोन युक्त नए सेट उत्पन्न करता है "।यह पूरी तरह से कार्यात्मक 'सेट' की तुलना में वास्तव में धीमी गति से होने वाला है। –