• Java实现行列式计算


    前天我看线代书,看到行列式,发现是个递归的式子,恰巧又正在学java,产生写程序实现的想法。写了两个小时,觉得实现了,写了个行列式放进去测试,我放的是

    1 2 3
    4 5 6
    7 8 9

    这个行列式,经过程序计算后发现结果是0。我以为我错了,于是我就去找错,发现返回结果的变量好像应该用静态变量,否则可能面临每次调用都初始化为0的情况,我以为这是结果是0的原因 。于是,我把结果变量改为静态变量,得到的结果不是0了,甚是高兴。于是用计算器验证我放进去的1-9的那个行列式的结果,发现竟然是0。 此时,我没有意识到我原本写的是对的,以为我这次是函数的结构或者其他啥的问题。几经折腾,发现改完之后只能计算二阶行列式能得到正确结果,三阶就不正确。再几经思考,发现在递归调用过程中,把结果储存到静态变量里时会进行重复的加,递归内加了一次,递归完成后又加了一次。遂改回原来的,得正确结果 。全程历时四小时有余,两小时写完代码,再两小时把代码改错且难受的思考再把代码改回原样。

     从这个故事我学会一件事,0不一定是错误结果
    下面是我写的代码。
    public class recursive {
    
        public static void main(String[] args) {
            // 定义一个数组
            int a[][] = {{1,2},{2,1}};
            aij b = new aij();
            System.out.println(b.det(a));
        }
    }
    
    class aij {
        // A函数可用于求余子阵
        int[][] A(int[][] a, int row, int column) {
            int[][] ans = new int[a.length - 1][a.length - 1];// ans用于储存返回的最终结果
            int[] temp = new int[(a.length - 1) * (a.length - 1)];// 临时一维数组temp用于按顺序储存剔除相应行和列元素后的数组
            int k = 0;
            // 剔除行和列并按顺序储存到temp内
            for (int i = 0; i < a.length; i++) {
                for (int j = 0; j < a[i].length; j++) {
                    if (i == row - 1) {
                        continue;
                    } else if (j == column - 1) {
                        continue;
                    }
                    temp[k++] = a[i][j];
                }
            }
            // 按顺序从temp中读取数据并储存到ans内
            k = 0;
            for (int i = 0; i < ans.length; i++) {
                for (int j = 0; j < ans[i].length; j++) {
                    ans[i][j] = temp[k++];
                }
            }
            return ans;
        }
    
        // det用于求行列式
        int det(int[][] a) {
            if (a.length == 1) {
                return a[0][0];
            } else {
                int ans=0;
                for (int i = 0; i < a.length; i++) {
                    ans+=a[i][0]*(int)Math.pow(-1, i)*det(A(a,i+1,1));
                }
                return ans;
            }
        }
    }
  • 相关阅读:
    Gulp插件less的使用
    并行与并发的区别
    原生javascript实现异步的7种方式
    原生JS实现bind()函数
    职责链模式
    Nginx如何启用ETag,提高访问速度
    前端性能优化:配置ETag
    迭代器模式
    JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
    cdn网络加速
  • 原文地址:https://www.cnblogs.com/roadwide/p/9728269.html
Copyright © 2020-2023  润新知