वहाँ दो स्पष्ट तरीके मेथेमेटिका में एक लिंक्ड सूची की संरचना करने, "छोड़" कर रहे हैं:बनाम राइट लिंक्ड सूची वाम, बदलें गति
{1, {2, {3, {4, {5, {6, {7, {}}}}}}}}
और "सही":
{{{{{{{{}, 7}, 6}, 5}, 4}, 3}, 2}, 1}
ये हो सकता है
drastitoLeftLL = Fold[{#2, #} &, {}, [email protected]#] & ;
toRightLL = Fold[List, {}, [email protected]#] & ;
अगर मैं इन का उपयोग, और एक सरल ReplaceRepeated
कर लिंक्ड सूची के माध्यम से चलने के लिए, मैं मिलता है: के साथ बनाया बड़ी सफाई अलग Timing
परिणाम:
r = Range[15000];
left = [email protected];
right = [email protected];
Timing[i = 0; left //. {head_, tail_} :> (i++; tail); i]
Timing[i = 0; right //. {tail_, head_} :> (i++; tail); i]
(* Out[6]= {0.016, 15000} *)
(* Out[7]= {5.437, 15000} *)
क्यों?
मुझे लगता है कि यह पूंछ कॉल अनुकूलन की वजह से तेजी से हो सकता है। – Andrey
इसे जांचें: http://stackoverflow.com/questions/4481301/tail-call-optimization-in-mathematica – Andrey
@Mr। जादूगर: क्या आप अपने 'नियम डीलेड' के आरएचएस को तोड़ सकते हैं। हालांकि मैं _think_ मैं देखता हूं कि यह सूची के माध्यम से कैसे चलता है, यह पूरी तरह स्पष्ट नहीं है। इसके अलावा, अगर मैं 'पूंछ-पूंछ + पूंछ 'के साथ आरएचएस में' पूंछ 'को प्रतिस्थापित करता हूं, तो मुझे एक त्रुटि मिलती है:' $ रिकर्सनलिमिट :: पुनः प्राप्त करें: 256 की रिकर्सन गहराई पार हो गई। >> 'और निरस्त करने की जरूरत है। एमएमए क्यों नहीं बताती कि 'पूंछ-पूंछ + पूंछ = पूंछ' और पहले जैसा ही परिणाम लौटाता है? – abcd