फिर से करना
, (पावेल के रूप में बताया, मैं इस सवाल का जवाब नहीं था, न कि केवल uniqifying बिट। तो मैं पानी में गिर मनोरंजन के लिए नीचे चला गया संबोधित किया।)
यहाँ एक विशुद्ध रूप से पुनरावर्ती है एकल-पास, मिलान-केवल विधि:
-module(nondupes).
-export([leave_uniques/1]).
leave_uniques(L) ->
lists:reverse(lu(lists:sort(L))).
lu(L = [H,H|_]) -> lu(L, [], dupe);
lu([H|T]) -> lu(T, [H], solo).
lu([H,H], A, dupe) -> A;
lu([_,H], A, dupe) -> [H|A];
lu([H,H], A, solo) -> A;
lu([P,H], A, solo) -> [P,H|A];
lu([H | T = [H|_]], A, dupe) -> lu(T, A, dupe);
lu([_ | T], A, dupe) -> lu(T, A, solo);
lu([H | T = [H|_]], A, solo) -> lu(T, A, dupe);
lu([P | T], A, solo) -> lu(T, [P|A], solo).
तो अतीत के अनुभव किसी भी न्यायाधीश है, यह शायद सूची/सेट घटाव से बड़ी सूचियों पर अधिक performant है - लेकिन अतीत के अनुभव भी है कि समय पे के सबसे मुझसे कहता है सुधार वास्तव में एक मुद्दा नहीं है। वैसे भी, यह मनोरंजक था।
उपयोग:
2> nondupes:leave_uniques([2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10]).
[2,3,5,7]
तुम भी 'दो सेट, एक सभी प्रविष्टियों आप अब तक देखा है रखने और अद्वितीय लोगों के साथ दूसरे के साथ reduce' कर सकते हैं। प्रत्येक आइटम के लिए, यदि यह देखी गई सूची में है, तो आपको इसे यूनिक से हटा देना चाहिए, अन्यथा आप दोनों को जोड़ दें। –
बस एक छोटा सा सुधार: कम चरण में आप मैन्युअल प्राप्त/रखे के बजाय '& Dict.update (& 2, और 1, 1, fn x -> x + 1 end) 'का भी उपयोग कर सकते हैं। –