आप पसंद करते हैं करने के लिए है कि हम अपने कोड से फिर से शुरू ठीक लग रहे हैं, तो चलो अपने कोड पर एक नजर है।सबसे पहले, मुख्य सूची काट:
reverse (take i (reverse xs)) ++ reverse (drop i (reverse xs))
अब reverse (take i (reverse xs))
सूची, के अंत से i
तत्वों लेता है, लेकिन आप इस लक्ष्य को हासिल करने के लिए दो बार सूची रिवर्स, और यह बेहतर हो drop (length xs - i) xs
करने के लिए होगा। इसी प्रकार, आप reverse (drop i (reverse xs)))
को take (length xs - i) xs
के रूप में कार्यान्वित कर सकते हैं। यही कारण है कि हमें
drop (length xs - i) xs ++ take (length xs - i) xs
देता है अब आप अपने कोड \i->[1..n]<=n
मतलब नहीं है, क्योंकि यह सूची [1..n]
n
साथ , जो काम नहीं कर सकता है। मुझे लगता है कि आप एक लूप बनाने की कोशिश कर रहे हैं जहां i
1
से n
तक चलता है, जो एक अच्छी योजना है। के लोगों को हम चाहते थे प्राप्त करने के लिए एक सूची समझ का उपयोग करते हैं:
[drop (length xs - i) xs ++ take (length xs - i) xs | i <- [1 .. length xs], i <= n]
लेकिन अब हम 1 से सूची की लंबाई के चला रहे हैं, लेकिन दूर, जो बेहतर लिखा जाएगा n
ऊपर संख्या फेंकने
[drop (length xs - i) xs ++ take (length xs - i) xs | i <- [1..n]]
यह n
को length xs
से अधिक होने की अनुमति देता है, लेकिन मुझे वहां कोई बड़ी समस्या नहीं दिखाई देती है, हम इसे पहले देख सकते हैं।
सूचना अब हम केवल प्रपत्र (length xs - i)
में i
का उपयोग कर कि कर रहे हैं, और वास्तव में हम हम चाहिए की तुलना में length xs
एक भयंकर बहुत अधिक recalculating रहे हैं, इसलिए बजाय n
करने के लिए 1
से i
रन दे की, और length xs - i
का उपयोग कर, कारण है कि हम सिर्फ length xs
से length xs - n
करने के लिए j=length xs -i
तो j
रन की जरूरत नहीं है:
[drop j xs ++ take j xs | j <- [length xs,length xs - 1 .. length xs - n]]
जो काम करता है क्योंकि उदाहरण [6,5..1] == [6,5,4,3,2,1]
के लिए
यह neater होगा
let l = length xs in
[drop j xs ++ take j xs | j <- [l,l - 1 .. l - n]]
करने के लिए या शायद आप take
से अधिक आप गणित करना पसंद चाहते हैं, इसलिए हम इस्तेमाल कर सकते हैं:
let l = length xs in
take n [drop j xs ++ take j xs | j <- [l,l - 1 .. 0]]
जो आप को रोकने के अतिरिक्त लाभ है जब आप शुरुआत में वापस आते हैं तो को रोककर बहुत अधिक कर रहे हैं।
मैं generatingListforRightShifting
से rotationsR
करने के लिए अपने समारोह का नाम बदलने चाहते हैं,
rotationsR n xs = let l = length xs in
take n [drop j xs ++ take j xs | j <- [l,l - 1 ..]]
कौन सा rotationsR 6 [1..4] == [[1,2,3,4],[4,1,2,3],[3,4,1,2],[2,3,4,1],[1,2,3,4]]
देता है दे रही है।
वाम रोटेशन सरल दिखेगा:
rotationsL n xs = take n [drop j xs ++ take j xs | j <- [0..length xs]]
विषयांतर: मैं अपने आप को मदद नहीं कर सकता है, माफ करना, और मैं फिर से शुरू कर दिया।
मैं अभी भी यह सब छोड़ने पसंद नहीं है और हर एक समय लग रहा है, मैं नहीं बल्कि अगले एक दूसरे को (cycle xs
) को xs
की असीम कई प्रतियां पॉप चाहते हैं और असीम कि के कई tails
ले उन सब को काटना सही लंबाई, लेकिन बस आपको पहला एन:
रोटेशन एल 'एन xs = let l = लंबाई xs एन ले लो। मानचित्र (एल ले लो)। पूंछ चक्र $ XS
क्योंकि आलसी मूल्यांकन की, केवल cycle xs
की एक निश्चित राशि कभी गणना की जाती है, लेकिन यह एक चलाने के लिए और चला सकते हैं: rotationsL' 10 [1..4]
आप देता है:
[[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4],[2,3,4,1]]
यह सही करने के लिए अच्छा होगा उस तरह की roations भी, लेकिन यह काम नहीं करता है क्योंकि मुझे एक अनंत सूची के अंत में शुरू करना होगा और अपना रास्ता वापस काम करना होगा। के अपने रिवर्स पुन: उपयोग करते हैं, ले आपको क्या चाहिए, चाल फिर रिवर्स, हालांकि:
rotationsR' n xs = let l = length xs in
take n . map (reverse.take l) . tails . cycle . reverse $ xs
Undigression: यदि आप अपने मूल कोड को और अधिक बारीकी से चिपके रहते हैं चाहते हैं, तो आप कर सकते हैं
generatingListforRightShifting n xs =
[reverse (take i (reverse xs)) ++ reverse (drop i (reverse xs)) | i <- [1..n]]
कि 'drop' होगा, कोई टी "शिफ्ट", जो "घुमाने" के लिए है। –
@ डैनियल फिशर: हाँ - मुझे बहुत देर हो गई, मैंने सवाल को आधा पढ़ा। "घुमाने" एक अच्छा नाम है। – xtofl
thnx से u xtolf। वास्तव में एक शुरुआत के रूप में मैं सिर, पूंछ, दोहराना जैसे सरल संचालन का उपयोग करने की कोशिश करता हूं। इस कारण से मैं इस समस्या का प्रयास करता हूं। मैं कोड को भारी रूप से छोटा नहीं करना चाहता हूं। थोड़ी देर के बाद fllowing पोर्टिन "(रिवर्स (ले लो (रिवर्स एक्सएस)) ++ रिवर्स (ड्रॉप i (रिवर्स एक्सएस))" एकल समय स्थानांतरण के लिए काम करता है। मैं इसे कई बार स्थानांतरित करने के लिए उपयोग करना चाहता हूं। क्या आप मेरी मदद कर सकते हैं? बीटीडब्ल्यू, थैक्स और बहुत बहुत thnx fr ur effrt – sabu