2011-08-29 10 views
5

मैं सभी तीन पत्र क्रमपरिवर्तन सूची कोशिश कर रहा हूँ और इस कोड को मेरे पास है -सूची परम्युटेशन्स

window.permute = function(){ 
    var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    var searchTerm ="aaa"; 
    var position = 2; 
    changeString(searchTerm, position); 
} 

window.changeString = function(searchTerm, position){ 
    if (position <0){ 
     alert(newString); 

    return; 
    } 
    var alphabet = "abcdefghijklmnopqrstuvwxyz" 
    for (j=0; j < 26;j++){ 
     var newString = searchTerm.substr(0, position) + alphabet[j] + searchTerm.substr(position+1); 
     var newPosition = position -1; 
     changeString(newString,newPosition); 
    } 
    return; 
} 

यह काम नहीं कर रहा है और मुझे यकीन है कि क्यों, किसी को भी मदद कर सकते हैं नहीं कर रहा हूँ?

+0

क्या आप कुछ और संदर्भ प्रदान कर सकते हैं? –

+0

er, अभी मुझे केवल बदलने के लिए पहला अक्षर मिल रहा है- मुझे सभी क्रमपरिवर्तन की आवश्यकता है – scubadiver

+0

इससे कोई फर्क नहीं पड़ता है, लेकिन पता है कि आप जो करने की कोशिश कर रहे हैं वह 26 उत्पन्न होता है!/(26-3)! = 15,600 तार। – nwellcome

उत्तर

1
alert(newString); 

newString वहां पर परिभाषित नहीं किया गया है।

alert(searchTerm); 

संपादित करें:: मैं अपने दृष्टिकोण की पूरी तरह से यकीन नहीं है इसके बजाय, आप तर्क पारित कर उपयोग करना चाहिए। यह अत्यधिक जटिल लगता है। ऐसा लगता है कि काम करता है। मैं समझता हूं कि आपके पास अपना कोड काम कर रहा है, लेकिन शायद यह आपको हल करने में मदद करता है। मुझे आपका substr भाग नहीं मिला है।

http://jsfiddle.net/NUG2A/2/

var alphabet = "abc"; // shortened to save time 

function permute(text) { 
    if(text.length === 3) { // if length is 3, combination is valid; alert 
     console.log(text); // or alert 
    } else { 
     var newalphabet = alphabet.split("").filter(function(v) { 
      return text.indexOf(v) === -1; 
     }); // construct a new alphabet of characters that are not used yet 
      // because each letter may only occur once in each combination 

     for(var i = 0; i < newalphabet.length; i++) { 
      permute(text + newalphabet[i]); // call permute with current text + new 
              // letter from filtered alphabet 
     } 
    } 
} 

permute(""); 

इस में निम्नलिखित बुलाया जा रहा परिणाम होगा:

permute(""); 
permute("a"); 
permute("ab"); 
permute("abc"); // alert 
permute("ac"); 
permute("acb"); // alert 
permute("b"); 
// ... 
+0

* फेसपाल्म - यहां तक ​​कि इसके साथ ही, मुझे केवल पहला अक्षर – scubadiver

+0

बदल गया है जिसका मतलब है कि रिटर्न में से एक ऐसा नहीं कर रहा है जो मैं करना चाहता हूं – scubadiver

+1

आप जो उत्पादन कर रहे हैं एक [पावर सेट] है (http://en.wikipedia.org/wiki/Power_set), क्रमपरिवर्तन नहीं। – wsanville

0
for (j=0; j < 26;j++){ 

for (var j=0; j<26; j++) { 
घोषणा के बिना

, j है होना चाहिए एक वैश्विक चर, इसलिए यह 26 पर जाने के लिए केवल एक पुनरावृत्ति लेता है और फिर सभी लूप समाप्त हो जाते हैं।

+0

प्रतीक्षा करें- इससे कोई फर्क पड़ता है? - कंसोल में कोई त्रुटि क्यों नहीं आई? – scubadiver

+0

हां - यदि आप 'var j' घोषित नहीं करते हैं, तो यह 'window.j' मानता है – Jimmy

+0

@ स्कूबाइवर ओह हाँ आपको नहीं पता कि ऑटो वैश्विक घोषणा के प्रभाव कितने सूक्ष्म हैं –

1

मुझे आपके प्रश्न से यह सुनिश्चित नहीं है कि आपका मतलब "क्रमपरिवर्तन" है क्योंकि आमतौर पर क्रमिक क्रम में दोहराए गए तत्व शामिल नहीं होते हैं, जहां ऐसा लगता है कि आप "aaa" शामिल करना चाहते हैं।

लिस्टिंग क्रमपरिवर्तन के लिए यहां several algorithms हैं जिन्हें आप चेक आउट कर सकते हैं। यदि यह पता चला है कि आपका पुनरावृत्ति होना है, तो ऐसा लगता है कि आपने पिमवडब को कवर किया है।

संपादित करें: तो आप जानते हैं कि आप रन-टाइम बुद्धिमान में हो रही है:

    पुनरावृत्ति के साथ
  • (एएए, AAB, ...): n^k = 26^3 = 17.576
  • पुनरावृत्ति के बिना (एबीसी, बीएसी, ...): एन!/(एनके)! = 26!/(26-3)! = 15.600
+0

यह संयोजन में नहीं है। एक सेट के संयोजन आदेश के बावजूद किए गए क्रमिक क्रमों के सेट का सेट है, प्रतिस्थापन के साथ सेट से क्रमपरिवर्तन नहीं। – Jimmy

+0

सच है, मैं परिभाषाओं का दुरुपयोग कर रहा था, मैंने इसे बाहर फेंक दिया और दोहराया "बिना" और "बिना" पुनरावृत्ति का उपयोग किया। – nwellcome

0

क्रमपरिवर्तन pimvd के रूप में एक पुनरावर्ती algorith से पता चला है के लिए हमेशा अच्छा है, लेकिन भूल नहीं है आप के लिए-छोरों के साथ सिर्फ जानवर बल कर सकते हैं यह जब एन छोटा है: के लिए

for(int x1=0; x1 < 26; x1++) 
for(int x2=0; x2 < 26; x2++) 
for(int x3=0; x3 < 26; x3++){ 
    //do something with x1, x2, x3 
} 
4
var permutate = (function() { 
    var results = [];  
    function doPermute(input, output, used, size, level) {   
     if (size == level) { 
      var word = output.join(''); 
      results.push(word); 
      return; 
     } 
     level++; 
     for (var i = 0; i < input.length; i++) { 
      if (used[i]) { 
       continue; 
      }    
      used[i] = true; 
      output.push(input[i]); 
      doPermute(input, output, used, size, level); 
      used[i] = false; 
      output.pop(); 
     } 
    } 

    return { 
     getPermutations: function(input, size) { 
      var chars = input.split(''); 
      var output = []; 
      var used = new Array(chars.length);  
      doPermute(chars, output, used, size, 0);   
      return results;  
     } 
    } 
})(); 

अधिक जानकारी के लिए, यहां जाएं http://jinwolf.tumblr.com/post/26476479113/draw-something-cheat एक काम कर, उदाहरण के लिए, देखें कि इस jsfiddle http://jsfiddle.net/jinwolf/Ek4N5/31/

-3

सी # में:

0,123,
void DoPermuation(string s) 
    { 
     var pool = new HashSet<string>(); 
     //Permute("", , pool); 
     pool = Permute(new List<char>(s)); 
     int i = 0; 
     foreach (var item in pool) Console.WriteLine("{0:D2}: {1}", ++i, item);  
    } 

    HashSet<string> Permute(List<char> range) 
    { 
     if (range.Count == 1) return new HashSet<string>(new string[] { range[0].ToString() }); 

     var pool = new HashSet<string>(); 
     foreach (var c in range) 
     {    
      var list = new List<char>(range); 
      list.Remove(c); 
      foreach (var item in Permute(list)) pool.Add(c + item);     
     } 

     return pool; 
    } 
+2

संभवतः यदि सी # में कोई जवाब वांछित था, तो यह प्रश्न में संकेत दिया गया होगा। –