2011-10-12 5 views
7

में संयोजन और क्रमपरिवर्तन कैलक्यूलेटर लिखने का सबसे प्रभावी तरीका मेरे पास गणित वेबसाइट http://finitehelp.com है जो छात्रों को फिनिट मैथ सिखाती है। मैंने सोचा कि कैलकुलेटर शामिल करना अच्छा होगा इसलिए मैंने जावास्क्रिप्ट में संयोजन और क्रमपरिवर्तन के लिए एक बनाया। लाइव कैलक्यूलेटर http://finitehelp.com/finite-calculator.html पर है। मैं जावास्क्रिप्ट के बारे में कुछ भी नहीं जानता और अनुमान लगाता हूं कि विशेष रूप से चर के अत्यधिक उपयोग के कारण निम्नलिखित लिखने का एक और अधिक प्रभावी तरीका है। अगर कोई मेरी मदद कर सकता है तो मैं बहुत आभारी रहूंगा।जावास्क्रिप्ट

<script type="text/javascript"> 
// calculate n! 
Math.factorial = function(n) 
{ 
    if(typeof n == 'string') n = Number(n); 
    if(typeof n != 'number' || isNaN(n)) 
    { 
     alert("Factorial requires a numeric argument."); 
     return null; 
    } 
    if (n < 2) return 1; 
    return (n * Math.factorial(n-1)); 
} 
Math.divide = function(a,b) 
{ 
    return a/b; 
} 
</script> 

<form class="form" name="combination" action=""> 
    <p>C(<input type="text" value="n" name="T1" size="1">,<input type="text" value="r" name="T2" size="1">) 
    <input type="button" value="Calculate" 
    onclick="var n = T1.value; var r = T2.value; var n_minus_r = parseFloat(n) - parseFloat(r); var numerator = Math.factorial(T1.value); var n_minus_r_fact = Math.factorial(n_minus_r); var r_fact = Math.factorial(r); var denominator = n_minus_r_fact * r_fact; T3.value = Math.divide(numerator,denominator); return true;"> 
    = <input type="text" name="T3" size="12" readonly></p> 
</form> 
+0

मेरा मानना ​​है कि यह केवल एक छात्र को कार्य सौंपने के लिए सबसे प्रभावी होगा। अतिरिक्त लाभ के बारे में सोचो! इसके अलावा, आपके हिस्से पर कोई प्रयास करने की आवश्यकता नहीं है, छात्र भी नई चीजें सीखेंगे, और आशा होने पर कोड को बनाए रखने और अपग्रेड करने की उम्मीद है: डी। – mingos

उत्तर

4

ठीक है, हम यहां जाते हैं!

सबसे पहले, आपको इसे कभी लिखने की आवश्यकता क्यों होगी?

Math.divide = function(a,b) 
{ 
    return a/b; 
} 

मैं पूरी तरह से इसके साथ दूर करना होगा।

आप भी अपनी Math.factorial एक छोटा सा साफ कर सकते हैं:

Math.factorial = function(n) 
{ 
    n = Number(n); 

    if (isNAN(n)) { 
     alert("Factorial requires a numeric argument."); 
     return null; 
    } else if (n < 2) { 
     return 1; 
    } else { 
     return (n * Math.factorial(n - 1)); 
    } 
} 

लेकिन मुख्य समस्या यह आपके onclick() कोड है:

onclick="var n = T1.value; var r = T2.value; var n_minus_r = parseFloat(n) - parseFloat(r); var numerator = Math.factorial(T1.value); var n_minus_r_fact = Math.factorial(n_minus_r); var r_fact = Math.factorial(r); var denominator = n_minus_r_fact * r_fact; T3.value = Math.divide(numerator,denominator); return true; 

यह वह जगह है रास्ता जटिल। मैं इसे एक समारोह बनाने के लिए और तत्व है, जो अपने HTML में बकवास के सभी से छुटकारा पाने के हैं करने के लिए इसे बाँध और यह थोड़ा आसान के साथ काम करने के लिए कर चाहते हैं:

window.onload = function() 
{ 
    document.getElementById('calculate').onclick = function() { 
     var n = T1.value, 
      r = T2.value; 

     T3.value = Math.factorial(n)/(Math.factorial(r) * Math.factorial(n - r)); 
    } 
} 

और बस onclick= से छुटकारा पाने के कोड।

+0

ने अभी नीचे उल्लू रिकर्सिव फ़ंक्शन का उल्लेख किया है। आधार के रूप में अपने काम का इस्तेमाल किया। – ymutlu

+0

मैंने देखा कि यह चेतावनी दो बार पॉप अप करता है। मैंने कुछ रिफैक्टरिंग करने की कोशिश की है। कार्यक्रम थोड़ी देर के लिए काम कर रहा है, लेकिन मैंने सोचा कि यह वापस लौटना मजेदार होगा और देखें कि मैं इसे कैसे सुधार सकता हूं क्योंकि यह मेरा पहला कार्यक्रम था। आपकी मदद के लिए बहुत बहुत धन्यवाद, मैंने लगभग छोड़ दिया था। वर्तमान संस्करण github https://gist.github.com/1861120 पर है। किसी भी प्रतिक्रिया या refactoring की सराहना की जाएगी। – Justin

+0

मुझे इसके साथ कुछ भी गलत नहीं मिल रहा है। अच्छी नौकरी! – Blender

0

मैं रिकर्सिव फ़ंक्शन पसंद करूंगा, पूंछ रिकर्सिव फाइबोनैकी जैसे कार्यों के लिए स्टैक ओवरफ्लो का कारण बन सकता है।

Math._factorial = function(n){ 
    return Math._fact(n,1); 
} 

Math._fact= function(n,res){ 
    n = Number(n); 
    if (n == null) { 
    alert("Factorial requires a numeric argument."); 
    return null; 
    } else if (n < 2){ 
    return res; 
    } else { 
    return Math._fact(n-1, res*n); 
    } 
} 
4

आप दक्षता को लेकर चिंतित हैं, तो आप शायद एक पुनरावर्ती एक एक सतत समारोह के बजाय भाज्य को फिर से लागू करना चाहते हैं। पुनरावर्ती संस्करण पुनरावर्तक संस्करण की तुलना में बहुत अधिक स्मृति और CPU समय का उपयोग करेगा।

function factorial(n) { 
    var x=1; 
    var f=1; 
    while (x<=n) { 
    f*=x; x++; 
    } 
    return f; 
} 

तुम भी गणित नाम स्थान के लिए अपने स्वयं के कार्यों को जोड़ने नहीं किया जाना चाहिए। इसमें प्रवेश करने की अच्छी आदत नहीं है।

1
Math.factorial= function(n){ 
    var i= n; 
    while(--i) n*= i; 
    return n; 
} 

Math.combinations= function(n, r, repeats){ 
    if(n< r) return 0; 
    if(n=== r) return 1; 
    if(repeats){ 
     return Math.factorial(n+r-1)/((Math.factorial(r)*Math.factorial(n-1))); 
    } 
    return Math.factorial(n)/((Math.factorial(r)*Math.factorial(n-r))); 
} 


var a= [ 
    'aqua', 'black', 'blue', 'fuchsia', 'gray', 'green', 'lime', 'maroon', 
    'navy', 'olive', 'orange', 'purple', 'red', 'silver', 'teal', 'white', 
    'yellow' 
] 
//how many 3 color combinations are there? 
//[red,green,blue] is different than [green,red,blue] 
// Math.combinations(a.length,3,true) >>969 
// how many unique combinations (ignoring order) are there? 
// Math.combinations(a.length,3)>>680 
संबंधित मुद्दे