Java生成多数值二元运算结果集

看之前大学写过的24点程序中用到的核心计算算法——计算四个值能否计算出24,当时用的c++写的,现用Java重写一遍

程序实现了多个数值(可重复)每个数值只能运算一次二元运算的条件下获得所有结果集

import java.util.ArrayList;
import java.util.Arrays;

public class point24 {

    public static void main(String[] args){
        float[] calcList = {2,3,4,5};
        calc24(calcList);
    }
    //实现n个数值运算化解为多个n-1数值运算,用递归思想在计算到单个数值的时候递归结束
    static void calc24(float[] calcList){
        if(calcList.length == 1) {//递归出口
            System.out.println(calcList[0]);
        }
        else {
            //双层循环遍历所有当前数组任意两个数进行运算,得到结果与没有进行运算的数值进行下一次运算
            for (int i = 0; i < calcList.length; i++) {
                for (int j = i+1; j < calcList.length; j++) {
                    float temp1 = calcList[i];
                    float temp2 = calcList[j];
                    ArrayList<Float> resultListFor2Nums = calcFor2Nums(temp1, temp2);
                    for (int n = 0; n < resultListFor2Nums.size(); n++) {
                        float[] nextCalList = calcList;
                        //删除掉数组中第i个值,并把第j个值替换成这两个值的运算结果
                        nextCalList[j] = nextCalList[nextCalList.length-1];
                        nextCalList = Arrays.copyOf(nextCalList,nextCalList.length-1);
                        nextCalList[i] = resultListFor2Nums.get(n);
                        
                        calc24(nextCalList); //递归在这
                    }
                }

            }
        }
    }
    //计算两个值在可以使用+-*/操作时可以得到的所有结果,可以扩展或者减少运算集
    static  ArrayList<Float> calcFor2Nums(float a,float b){
        ArrayList<Float> resultList = new ArrayList<>();
        resultList.add(a + b);
        resultList.add(a - b);
        resultList.add(a * b);
        resultList.add(a / b);
        resultList.add(b - a);
        resultList.add(b / a);
        return resultList;
    }

}

  

posted @ 2018-01-04 06:39  Jacck  阅读(612)  评论(0编辑  收藏  举报