2015-05-28 11 views
9

मैं कुछ अजीब देखा जबकि this mergesort implementation on Code Review की समीक्षा ...यह विलय "विफल" होना चाहिए, है ना?

/************************************************************ 
 
* Mergesort implementation 
 
***********************************************************/ 
 

 
function sort(array) { 
 
    var len = array.length; 
 
    var middle = Math.floor(len*0.5); 
 
    var left = array.slice(0,middle); 
 
    var right = array.slice(middle, len); 
 

 
    if (len == 1) { 
 
    return array; 
 
    } else { 
 

 
    } 
 

 
    return merge(sort(left), sort(right)); 
 
} 
 

 

 
function merge(left, right) { 
 
    var a = left.length; 
 
    var b = right.length; 
 

 

 
    if (a > 0 && b > 0) { 
 
    if (left[0] > right[0]) { 
 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
 
    } else { 
 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
 
    } 
 
    } else if (a == 0) { 
 
    return right; 
 
    } else of (b == 0) 
 
    return left; 
 

 
} 
 

 

 
/************************************************************ 
 
* Demonstration 
 
***********************************************************/ 
 

 
function doSort() { 
 
    var array = document.getElementById('in').value.split(/[, ]+/).map(function(e) { 
 
     return parseInt(e); 
 
    }); 
 
    var sorted = sort(array); 
 
    document.getElementById('out').value = sorted; 
 
} 
 

 
function generateRandom(len) { 
 
    var array = []; 
 
    for (var i = 0; i < len; i++) { 
 
     array.push(Math.round(Math.random() * 100)); 
 
    } 
 
    document.getElementById('in').value = array; 
 
}; 
 

 
generateRandom(20);
<button onclick="generateRandom(20)">⬇︎ Generate random numbers ⬇︎</button> 
 
<div><input id="in" size="80"></div> 
 
<button onclick="doSort()">⬇︎ Sort ⬇︎</button> 
 
<div><input id="out" size="80" disabled></div>

पिछले सशर्त शाखा else of बजायelse if है। आम तौर पर, else of परिणामस्वरूप एक वाक्यविन्यास त्रुटि होनी चाहिए। फिर भी, कोई फर्क नहीं पड़ता कि मैं कितनी मेहनत करता हूं, मैं सिंटैक्स त्रुटि को ट्रिगर नहीं कर सकता - यह हमेशा अवरोही क्रम में क्रमबद्ध एक सरणी को सफलतापूर्वक देता है!

मुझे पता है, else of (b == 0) को केवल else द्वारा प्रतिस्थापित किया जा सकता है, लेकिन फिर भी, मैं जानना चाहता हूं: यह कोड संभवतः कैसे काम कर सकता है?

+0

कोड मेरे लिए काम करता है। –

+0

क्रोमियम पर बस ठीक काम करता है ... – Vogel612

उत्तर

4

यह जावास्क्रिप्ट के बारे में 2 "बुरी चीजों" के संयोजन के कारण काम करता है: ब्लॉक स्टेटमेंट्स में ब्रेसिज़ को छोड़कर जिसमें केवल एक ही कथन होता है, और semicolon insertion। क्योंकि लापता ब्रेसिज़ और अर्धविराम प्रविष्टि के

if (a > 0 && b > 0) { 
    if (left[0] > right[0]) { 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
    } else { 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
    } 
} else if (a == 0) { 
    return right; 
} else of (b == 0) { 
    return left; 
} 

लेकिन,, जावास्क्रिप्ट/इस तरह यह पार्स करने देख रही है:

आपका if बयान, ठीक से braced, इस तरह दिखना चाहिए

if (a > 0 && b > 0) { 
    if (left[0] > right[0]) { 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
    } else { 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
    } 
} else if (a == 0) { 
    return right; 
} else { 
    of(b == 0); 
} 

return left; 

यदि आप हमेशा वैध left और right सरणी में पास करते हैं तो यह अंतिम else शाखा कभी नहीं पहुंच पाई है, इसलिए आपने अपवाद क्यों नहीं देखा है।

आप एक खाली right सरणी में पार कर लेते हैं, यह पिछले शाखा तक पहुँचने और of is not a function फेंक देगा:

merge([10, 20, 30], []); 

किसी भी सम्मानजनक कोडिंग मानक स्पष्ट रूप से इन 2 "सुविधाओं" की आवश्यकता होती है चाहिए जावास्क्रिप्ट कभी नहीं इस्तेमाल किया जा ... लेकिन यह सिर्फ एक राय है।

+1

'भाग के बराबर' और नहीं होगा {बी == 0)} वापस लौटा; '? – Siguza

+0

यदि कुछ भी हो, तो यह और होगा (बी == 0)) {वापसी शेष; } ' –

+1

जब से कोई और तर्क लेता है? ऐसा नहीं है कि यह 'else if' था ... – Siguza

3

of ES6 में एक कीवर्ड, वस्तुओं से अधिक पुनरावृत्ति .. के लिए लेकिन इस मामले of समारोह कीवर्ड नहीं के रूप में बर्ताव कर रही है में प्रयोग किया जाता है ..

समारोह कोड कभी नहीं else of (b == 0) return left; भाग को जाता है .. इसलिए संकलक है ReferenceError: of is not defined

नहीं फेंक अगर आप else often(b==0).... की तरह एक और शब्द में of कीवर्ड बदल जाएगा तो भी कोड काम

जब आप सही पक्ष खाली भेज तो कोड erro फेंक होगा आर ReferenceError: of is not defined, तो आखिर में यह केवल टाइपो है।

संबंधित मुद्दे