读书人

一个相干组合公式的算法的java实现

发布时间: 2012-12-20 09:53:21 作者: rapoo

一个有关组合公式的算法的java实现

/** * 组合公式的求和C(m,n),求平均数; * 用户输入一个数m,并给出含有m个元素的float数组,再输入一个数n。 * 求m个数里选出n个数相乘的所有情况,并求出这些情况的结果的平均值。 * 用遍历树的方法 * @author yuantao * */public class 组合公式 {/** * 按层遍历函数,并实现递归求值。从本质上说,每一个递归函数可看作一个对列状集合中的一部分元素(从任一个节点开始到最后那个元素)的循环遍历,并进行相应的操作。 * cache=float[2],cache[0]存放所有情况的总和,cache[1]存放可能的情况的总数  * parentValue存放当到前层父节点为止的中间乘积结果,开始时的初始值设为1 * @param levelStart 当前层遍历的起始元素。其值与该层的最左节点对应的datas数组元素的序数相同 * @param depthRemain 该次深度遍历还要遍历的深度,其值初始为n. * @param datas 用户给出的n个数的存放地点 * @param cache 中间结果的存放地点 cache=float[2],cache[0]存放所有情况的总和,cache[1]存放可能的情况的总数。 * @param parentValue 存放当到前层父节点为止的中间乘积结果 */public void levelResult(int levelStart,int depthRemain,float[] datas,float[] cache,float parentValue){/** * 对当前循选定的集合元素进行遍历。在for循环内为对当前的操作;在for循环外为与当前核心数据状态有关的操作 */for(int i = levelStart;i<datas.length;i++){float nextParentValue = parentValue*datas[i];//设定下一层遍历(下一次递归)的父节点的值int nextDepthRemain = depthRemain-1;//设定下一层的剩余深度/** * 一次深度遍历完成的标志 */if(nextDepthRemain==0){cache[0]+=nextParentValue;//将该次结果累加进总结果cache[1]++;//情况总数加一int t = (int)cache[1];System.out.print("第"+t+"种情况的积为:"+nextParentValue+"");if(i%5==0)System.out.println();continue;//不再进入下一层,而是继续本层的操作}//此处为进入下一的通道入口。levelResult(i+1,nextDepthRemain,datas,cache,nextParentValue);}//此处为返回上层的通道的入口/** * 所有情况遍历完成的标志,即进入进入最顶层的通道的标志 */if(levelStart==0){System.out.println("\n所有情况的总和是:"+cache[0]+"");System.out.println("所有情况总和的平均数是:"+cache[0]/cache[1]);}//此处为返回上层的通道的出口}public static void main(String[] args){//求C(m,n)的情况。//模拟用户的初始化输入int m=4,n=3;float[] datas=new float[m];for(int i=0;i<m;i++)datas[i] =(float)i;//最开始时的parentValuefloat rootValue = 1f;//第一次循环时的起始元素序号int startLevel = 0;//记录结果的数组,将其的引用传入运行函数中float[] cache = {0f,0f};AssemblePlus1 ap = new AssemblePlus1();ap.levelResult(startLevel, n, datas, cache,rootValue);}}

读书人网 >编程

热点推荐