2011-10-12 47 views
7

Tôi có một trang web toán học http://finitehelp.com dạy cho học sinh Toán hữu hạn. Tôi nghĩ rằng nó sẽ là mát mẻ để bao gồm một máy tính vì vậy tôi đã thực hiện một cho sự kết hợp và hoán vị trong Javascript. Máy tính trực tiếp là http://finitehelp.com/finite-calculator.html. Tôi biết bên cạnh không có gì về Javascript và sẽ mạo hiểm để đoán có một cách hiệu quả hơn nhiều để viết sau đây đặc biệt là vì việc sử dụng quá nhiều biến. Nếu ai đó có thể giúp tôi, tôi sẽ rất biết ơn.Cách hiệu quả nhất để viết Máy tính kết hợp và phép tính trong Javascript

<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

Tôi tin rằng sẽ hiệu quả nhất khi chỉ giao nhiệm vụ cho sinh viên. Hãy suy nghĩ về những lợi ích bổ sung! Ngoài việc không cần nỗ lực từ phía bạn, sinh viên cũng sẽ học được những thứ mới, và hy vọng duy trì và nâng cấp mã nếu cần phát sinh: D. – mingos

Trả lời

4

Vâng, ở đây chúng tôi đi!

Trước hết, tại sao bạn lại cần viết điều này?

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

Tôi sẽ loại bỏ hoàn toàn.

Bạn cũng có thể dọn dẹp Math.factorial của bạn một chút:

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)); 
    } 
} 

Nhưng vấn đề chính là mã của bạn 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; 

Đây là cách quá phức tạp. Tôi muốn làm cho nó một chức năng và ràng buộc nó vào các yếu tố, trong đó sẽ thoát khỏi tất cả các crap trong HTML của bạn và làm cho nó một chút dễ dàng hơn để làm việc với:

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)); 
    } 
} 

Và chỉ thoát khỏi những onclick= mã.

+0

vừa đề cập đến chức năng đệ quy abuot dưới đây. Đã sử dụng hàm của bạn làm cơ sở. – ymutlu

+0

Tôi nhận thấy rằng điều này làm cho cảnh báo bật lên hai lần. Tôi đã cố gắng để làm một số refactoring. Chương trình này đã hoạt động được một thời gian nhưng tôi nghĩ sẽ rất thú vị khi trở lại với nó và xem cách tôi có thể cải thiện nó như là chương trình đầu tiên của tôi. Cảm ơn bạn rất nhiều vì đã giúp đỡ tôi gần như đã từ bỏ. Phiên bản hiện tại là trên github https://gist.github.com/1861120. Mọi phản hồi hoặc tái cấu trúc sẽ được đánh giá cao. – Justin

+0

Tôi không thể tìm thấy bất cứ điều gì sai trái với nó. Công việc tốt! – Blender

0

Tôi thích chức năng đệ quy, đuôi đệ quy có thể gây ra stackoverflow cho các chức năng như fibonacci.

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

Nếu bạn lo ngại về hiệu quả, bạn có thể muốn triển khai lại giai thừa dưới dạng hàm lặp thay vì hàm đệ quy. Phiên bản đệ quy sẽ sử dụng nhiều bộ nhớ và thời gian CPU hơn phiên bản lặp lại.

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

Bạn cũng không nên thêm chức năng của riêng mình vào không gian tên Math. Nó không phải là một thói quen tốt để có được vào.

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 
Các vấn đề liên quan