private int getOptionVarArr_rec(VdsObj vdsObj, int r, List<Integer> arrVarQuantset, List<Integer> arrVarQuantRes, int[] applycache) { if (r < 2) { return r; } List<BddObj> P_arrAllNodes = vdsObj.getP_arrAllNodes(); BddObj oNode = P_arrAllNodes.get(r); int iLvl = oNode.getLevel(); if (applycache[r] != -1) return applycache[r]; int res, val0, val1; if (arrVarQuantset.get(iLvl) == 1) res = getOptionVarArr_rec(vdsObj, oNode.getHigh(), arrVarQuantset, arrVarQuantRes, applycache); else if (arrVarQuantset.get(iLvl) == 0) res = getOptionVarArr_rec(vdsObj, oNode.getLow(), arrVarQuantset, arrVarQuantRes, applycache); else { val0 = getOptionVarArr_rec(vdsObj, oNode.getLow(), arrVarQuantset, arrVarQuantRes, applycache); val1 = getOptionVarArr_rec(vdsObj, oNode.getHigh(), arrVarQuantset, arrVarQuantRes, applycache); int iLowLvl = P_arrAllNodes.get(oNode.getLow()).getLevel(); int iHighLvl = P_arrAllNodes.get(oNode.getHigh()).getLevel(); if (val0 == 1 && val1 == 1) { arrVarQuantRes = setOneVarOption(iLvl, -2, arrVarQuantset, arrVarQuantRes); if (iLvl + 1 < iLowLvl) arrVarQuantRes = getOptionVarArr_rec_lvl(iLvl, iLowLvl, arrVarQuantset, arrVarQuantRes); if (iLvl + 1 < iHighLvl) arrVarQuantRes = getOptionVarArr_rec_lvl(iLvl, iHighLvl, arrVarQuantset, arrVarQuantRes); res = 1; } else if (val0 == 1 && val1 == 0) { arrVarQuantRes = setOneVarOption(iLvl, 0, arrVarQuantset, arrVarQuantRes); if (iLvl + 1 < iLowLvl) arrVarQuantRes = getOptionVarArr_rec_lvl(iLvl, iLowLvl, arrVarQuantset, arrVarQuantRes); res = 1; } else if (val0 == 0 && val1 == 1) { arrVarQuantRes = setOneVarOption(iLvl, 1, arrVarQuantset, arrVarQuantRes); if (iLvl + 1 < iHighLvl) arrVarQuantRes = getOptionVarArr_rec_lvl(iLvl, iHighLvl, arrVarQuantset, arrVarQuantRes); res = 1; } else res = 0; } applycache[r] = res; return res; }
不太明白val0 = getOptionVarArr_rec(vdsObj, oNode.getLow(), arrVarQuantset,
arrVarQuantRes, applycache); 下的代码是如何执行。我的理解是不断的调用getOptionVarArr_rec方法,遇到r < 2为true时退出,但实际代码能执行下去val1的值
相关分类