2012-05-14 40 views
0

我在玩数组,我试着做一个递归函数来计算矩阵A [i] [j]的行列式,其中i = j = k。我写的功能如下。看来我做错了什么,但我不知道是什么。 A数组由用户定义并由另一个函数读取。我试图做到这一点,而不使用和库或预定义的对象。 我已经添加了整个代码为你做一个总体思路:矩阵行列式计算器的递归函数

<script> 

    var k; 

    function readGrad() {  //reads the matrix dimesnions  
     k = parseInt(document.getElementById("grad").value);    
     if (isNaN(k)) { 
      alert('Gradul introdus nu este intreg, reintroduceti gradul matricii'); 
     } 
     if (k == 0) { 
      alert ('Determinantul trebuie sa fie mai mare ca 1'); 
     } 
     if (k == 1) { 
      alert ('Determinantul trebuie sa fie mai mare ca 1'); 
     } 
     return k; 
    }  

    function genTable(i,j) {   //generates the table for the user to insert the values 
     //var i,j = parseInt(document.getElementById("grad").value); 
     var myTable = '<TABLE BORDER="1" BORDERCOLOR="BLACK">\n <TBODY>\n'; 
     for (i = 0; i < 1; i++) { 
      myTable += ' <TR>\n'; 
      for (j = 0; j < k+1; j++) { 
       myTable += ' <TD>'+j+'</TD>\n'; 
      } 
      myTable += ' </TR>\n'; 
     } 
     for (i = 1; i < k+1; i++) { 
      myTable += ' <TR>\n'; 
      for (j = 0; j < 1; j++) { 
       myTable += ' <TD>'+i+'</TD>\n'; 
      } 
      for (j = 1; j < k+1; j++) { 
      myTable += ' <TD><input class="element" id="A' + i + j + '"value="0"></TD>\n'; 
      } 
      myTable += ' </TR>\n'; 
     } 
     myTable += ' </TBODY>\n</TABLE>\n'; 
     document.getElementById('container').innerHTML = myTable; 
    } 

    function calcDet() { 

     var A = [];  //generates the array 
      for (var i = 0; i < k; i++) { 
       A[i] = []; 
       for (var j = 0; j < k; j++) {      
        A[i][j] = i + ':' + j;    
       } 
      }   

     for (var i = 0; i < k; i++) { //reads the array 
      for (var j=0; j<k; j++) { 
       var id = "A" + (i + 1) + (j + 1); 
       A[i][j] = parseFloat(document.getElementById(id).value);           
      } 
     } 

     var s; 
     var det = 0; 

     function calcRec (A) { 
      if (A.length == 1) {  //bottom case of the recursive function 
       alert (A) 
      } 
      if (i == 2) {  
       det = A[0][0] * A[1][1] - A[1][0] * A [0][1]; 
       alert (det); 
      } 

      for (var i=0; i<k; i++) { //creates smaller matrix- values not in same row, column 
       var smaller=new Array(A.length-1); 
       for(h=0;h<smaller.length;h++){ 
       smaller[h]=new Array(smaller.length); 
       } 
      } 

      for(a=1;a<A.length;a++){  
       for(b=0;b<A.length;b++){ 
        if(b<i){ 
        smaller[a-1][b]=A[a][b]; 
        } 
        else if(b>i){ 
         smaller[a-1][b-1]=A[a][b]; 
        } 
       } 
      } 

      if (i%2==0) { 
       s=1; 
      } 
      else { 
       s=-1; 
      } 
      det+=s*matrix[0][i]*(calcRec(smaller));  
      return (det); 
     } 
     } 
</script> 
<body style="background-color: #777; color: ddd;"> 
    <div style="margin: 20px;"> 
     <h1>Program de calculare determinant matrice de orice grad.</h1> 
    </div> 
    <div> 
     Introduceti gradul matricei 
     <input id="grad" type="text" value="" style="width: 50px;" onChange="readGrad()">   
     <input style="margin-top: 20px;" type="button" name="Calculate determinant" value="Generati tabel" onClick="genTable()"> 
    </div> 
    <form name="Det Matrice"> 
     <div style="margin-top: 100px; float: left; width: 100%;"> 
      Introduceti valorile: 
      <table style="text-align: center;"> 
       <div id="container"></div> 
      </table> 
      <br> 
     </div> 
     <div style="float: left; margin-top: 20px;">    
      <input type="button" name="Calculate determinant" value="Calculati determinant" onClick="calcDet()"> 
     </div> 
    </form> 

</body> 
+0

你能否提供一些有关错误的更多细节?是否引发错误?一些示例输入,预期输出以及您获得的“错误”输出也会有所帮助。 – DGH

+0

ideea是当我按下一个按钮calcDet()被调用,它应该警告det的最终值,但现在没有任何反应。代码相当长。如果你愿意的话,我可以添加它,但如果我注释掉这个函数并用简单的警报(A)替换它,那么一切都会好起来。 – viktor

+0

我已经添加了整个代码 – viktor

回答

-1

撒母耳指出的那样,你需要调用calcRec calcDet(这是由onclick事件调用)内。你现在正在做的是在函数内部定义一个函数。

它看起来像你试图在Javascript中实现this(你遗留了一些工件,比如在之前使用“A”的底部使用变量“矩阵”)。如果是这样的目标,这应该是非常接近你所追求的:

function calcDet() { 
    var A = []; //generates the array 
    for (var i = 0; i < k; i++) { 
     A[i] = []; 
     for (var j = 0; j < k; j++) { 
      A[i][j] = i + ':' + j; 
     } 
    } 
    for (var i = 0; i < k; i++) { //reads the array 
     for (var j = 0; j < k; j++) { 
      var id = "A" + (i + 1) + (j + 1); 
      A[i][j] = parseFloat(document.getElementById(id).value); 
     } 
    } 

    function calcRec(A) { 
     var s; 
     var det = 0; 
     if (A.length == 1) { //bottom case of the recursive function 
      return A[0][0]; 
     } 
     if (A.length == 2) {  
      det = A[0][0] * A[1][1] - A[1][0] * A [0][1]; 
      return det; 
     } 
     for (var i = 0; i < k; i++) { 
      //creates smaller matrix- values not in same row, column 
      var smaller = new Array(A.length - 1); 
      for (h = 0; h < smaller.length; h++) { 
       smaller[h] = new Array(A.length - 1); 
      } 
      for (a = 1; a < A.length; a++) { 
       for (b = 0; b < A.length; b++) { 
        if (b < i) { 
         smaller[a - 1][b] = A[a][b]; 
        } else if (b > i) { 
         smaller[a - 1][b - 1] = A[a][b]; 
        } 
       } 
      } 
      if (i % 2 == 0) { 
       s = 1; 
      } else { 
       s = -1; 
      } 
      det += s * A[0][i] * (calcRec(smaller)); 
     } 
     return (det); 
    } 
    alert(calcRec(A)); 
} 

你的“我”循环的范围为打造“小”数组是错误的,“DET”的初始化是“calcRec”之外可能导致一些未定义的行为。

+0

是的。我知道这个链接,那是我试图重现的algorythm。但是我现在太累了,明天我会看看这个。谢谢 – viktor