एफ # में परिवर्तनीय डेटा संरचनाओं को लागू करने का एक अच्छा तरीका क्या है? कारण मैं पूछ रहा हूं क्योंकि मैं वापस जाना चाहता हूं और डेटा संरचनाओं को लागू करना चाहता हूं जो मैंने एल्गोरिदम कक्षा में सीखा है, मैंने इस सेमेस्टर को लिया है (सूचियों की सूची, स्प्ले पेड़, संलयन पेड़, वाई-फास्ट कोशिश, वैन एम्डे बोस पेड़ इत्यादि। ।), जो एक शुद्ध सिद्धांत पाठ्यक्रम था, जिसमें कोई भी कोडिंग नहीं था, और मुझे लगता है कि मैं इसे कर रहा हूं जबकि मैं इसे F # सीखने की कोशिश कर सकता हूं। मुझे पता है कि मुझे एक कार्यात्मक भाषा में स्प्ले पेड़ की कार्यक्षमता प्राप्त करने के लिए उंगली के पेड़ों का उपयोग करना चाहिए, और मुझे स्किप-सूची कार्यक्षमता आदि प्राप्त करने के लिए आलस्य के साथ कुछ करना चाहिए, लेकिन मैं कोशिश करने से पहले मूलभूत बातें प्राप्त करना चाहता हूं पूरी तरह कार्यात्मक कार्यान्वयन के साथ खेलना।एफ # में परिवर्तनीय डेटा संरचनाओं (उदाहरण के लिए, सूची छोड़ें, पेड़ स्प्ले) करने का सही तरीका क्या है?
एफ # में कार्यात्मक डेटा संरचनाओं को कैसे करें, इसके बारे में बहुत सारे उदाहरण हैं, लेकिन म्यूटेबल डेटा संरचनाओं को कैसे करें, इस पर बहुत कुछ नहीं है, इसलिए मैंने दोगुनी लिंक्ड सूची here को किसी ऐसी चीज में ठीक करना शुरू किया जो आवेषण की अनुमति देता है और कहीं भी हटा देता है। मेरी योजना इसे एक स्किप सूची में बदलना है, और फिर पेड़ संरचनाओं के लिए एक समान संरचना (रिकॉर्ड के भेदभाव संघ) का उपयोग करना है जिसे मैं कार्यान्वित करना चाहता हूं। कुछ और अधिक महत्वपूर्ण शुरू करने से पहले, क्या एफ # में इस तरह के परिवर्तनीय संरचनाओं को करने का एक बेहतर तरीका है? क्या मुझे सिर्फ रिकॉर्ड का उपयोग करना चाहिए और भेदभाव वाले संघ से परेशान नहीं होना चाहिए? क्या मुझे इसके बजाय कक्षा का उपयोग करना चाहिए? क्या यह प्रश्न "गलत भी नहीं है"? क्या मुझे सी # में म्यूटेबल स्ट्रक्चर्स करना चाहिए, और एफ # में डुबकी नहीं डालना चाहिए जब तक कि मैं उन्हें अपने पूरी तरह कार्यात्मक समकक्षों से तुलना नहीं करना चाहता?
और, यदि रिकॉर्ड की एक डीयू है जो मैं चाहता हूं, तो क्या मैं नीचे दिए गए कोड को बेहतर या अधिक मूर्खता से लिख सकता हूं? ऐसा लगता है कि यहां बहुत सारी अनावश्यकता है, लेकिन मुझे यकीन नहीं है कि इससे कैसे छुटकारा पाना है।
module DoublyLinkedList =
type 'a ll =
| None
| Node of 'a ll_node
and 'a ll_node = {
mutable Prev: 'a ll;
Element : 'a ;
mutable Next: 'a ll;
}
let insert x l =
match l with
| None -> Node({ Prev=None; Element=x; Next=None })
| Node(node) ->
match node.Prev with
| None ->
let new_node = { Prev=None; Element=x; Next=Node(node)}
node.Prev <- Node(new_node)
Node(new_node)
| Node(prev_node) ->
let new_node = { Prev=node.Prev; Element=x; Next=Node(node)}
node.Prev <- Node(new_node)
prev_node.Next <- Node(new_node)
Node(prev_node)
let rec nth n l =
match n, l with
| _,None -> None
| _,Node(node) when n > 0 -> nth (n-1) node.Next
| _,Node(node) when n < 0 -> nth (n+1) node.Prev
| _,Node(node) -> Node(node) //hopefully only when n = 0 :-)
let rec printLinkedList head =
match head with
| None ->()
| Node(x) ->
let prev = match x.Prev with
| None -> "-"
| Node(y) -> y.Element.ToString()
let cur = x.Element.ToString()
let next = match x.Next with
| None -> "-"
| Node(y) -> y.Element.ToString()
printfn "%s, <- %s -> %s" prev cur next
printLinkedList x.Next
यह भी देखें http://cs.hubfs.net/forums/thread/14029.aspx – Brian
आप जानते हैं कि हैशटेबल्स और लिंक्ड सूचियों के अलावा, मुझे व्यक्तिगत रूप से अस्थिर समकक्षों की तुलना में अपरिवर्तनीय डेटा संरचनाओं को लागू करना बहुत आसान लगता है - खासकर पेड़। आपकी माइलेज भिन्न हो सकती है। – Juliet
जूलियट: सरणी के बारे में क्या? निश्चित रूप से उन पर उत्परिवर्ती लागू करना आसान है। – Gabe