private static int row=0;
private static int n = 100;


public void P2() {
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
if ((i > j)) {
System.out.println("row:" + (++row) + "   " + i + "\t" + j);
}
}
}
}


public void P3() {
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
for (int k = n; k >= 1; k--) {
if ((i > j) && (j > k)) {
if (i + j + k == n) {
System.out.println("row:" + (++row) + "   " + i + "\t" + j + "\t" + k);
}
}
}
}
}
}

public void P4() {
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
for (int k = n; k >= 1; k--) {
for (int k2 = n; k2 >=1; k2--) {
if ((i > j) && (j > k)&&(k>k2)) {
if (i + j + k +k2== n) {
System.out.println("row:" + (++row) + "   " + i + "\t" + j + "\t" + k+ "\t" + k2);
}
}
}
}
}
}
}
重复太多了!有什么好的递归方式!

解决方案 »

  1.   

    不需要递归,如果不希望出现重复数字,可以调整一下方法class Test {
        public static void main(String[] args) {
            int n = 10;
            for (int i=2; i<5; i++) {
                analyze(n, i);
            }
        }
        
        public static void analyze(int sum, int num) {
            if (num < 2) {
                System.out.printf("row:%d    %d=%d\n", 1, sum, sum);
                return;
            }
            
            int tmp = 0, row = 0;
            int[] idx = new int[num];
            System.out.printf("row:%d    ", ++row);
            for (int i=0; i<num-1; i++) {
                idx[i] = 1;
                tmp += idx[i];
                System.out.printf("%d+", idx[i]);
            }
            idx[num-1] = sum-tmp;
            System.out.printf("%d=%d\r\n", idx[num-1], sum);        while (true) {
                idx[num-2]++;
                for (int i=num-2; i>0; i--) {
                    tmp = 0;
                    for (int j=0; j<i; j++) {tmp+=idx[j];}
                    if (idx[i] > (sum-tmp)/(num-i)) {
                        idx[i-1]++;
                    }
                }
                if (idx[0] > sum/num) {break;}
                tmp = 0;
                for (int i=1; i<num-1; i++) {
                    tmp += idx[i-1];
                    if (idx[i] > (sum-tmp)/(num-i)) {
                        idx[i] = idx[i-1];
                    }
                }
                tmp = 0;
                System.out.printf("row:%d    ", ++row);
                for (int i=0; i<num-1; i++) {
                   tmp += idx[i];
                   System.out.printf("%d+", idx[i]);
                }
                idx[num-1] = sum-tmp;
                System.out.printf("%d=%d\r\n", idx[num-1], sum);
            }
        }
    }
      

  2.   

    lz 根据我的实践    你需要运算的东西 ,线性太长了,无法执行 。最后会报错(堆栈溢出),还有就是你写的东西有很多多余的!   具体算法的可以给你参考!  public void P2() {
            for (int i = n; i >= 1; i--) {
                for (int j = n; j >= 1; j--) {
                 length ++;
                    if ((i > j)) {
                        System.out.println("row:" + (++row) + "   " + i + "\t" + j);
                    }
                }
            }
            System.out.println("length: " + length);
        }    
        //另一种写话   少运算多少次
        
        public void P2s(){
         for (int i = n; i >=1; i--) {
    for (int j = i-1; j < i && j>=1; j--) {
    length++;
    System.out.println("row:" + (++row) + "   " + i + "\t" + j);
    }
    }
        
        
        }
        
        public void P2d(int i ,int j){
         length++;
         j = i<=j?i-1:j;
         if(i==1)return;  //如果最外面的一层条件结束   那么方法执行结束
         if(j== 1)P2d(i-1,i-2);  //如果里面一层条件结束  自动将条件进行设置
         System.out.println("row:" + (++row) + "   " + i + "\t" + j);
         P2d(i,j-1);
        }
      

  3.   

    public static void p(int i,int j, int k, int k2,int n,int row){
    if(i + j + k + k2 == n){
    System.out.println("row:" + (++row) + "   " + i + "\t" + j + "\t" + k+ "\t" + k2);
    }else {
    if(k2 - 1 >= 1){
    p(i,j,k,k2-1,n,row);
    }else if(k - 1 >= 1){
    k2 = k -1;
    p(i,j,k,k2-1,n,row);
    }else if(j - 1 >= 1){
    k = j -1;
    p(i,j,k,k2-1,n,row);
    }else if(i - 1 >= 1){
    j = k -1;
    p(i,j,k,k2-1,n,row);
    }else {
    return;
    }

    }
    }
    我试着写了个 确实,堆栈溢出了!n = 5都溢出了 更别提100了。 所以楼主还是熄了这个递归的心思吧。以前倒是没注意这方面的,看样自己还得注意些