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);
}
}
}
}
}
}
}
重复太多了!有什么好的递归方式!
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);
}
}
}
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);
}
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了。 所以楼主还是熄了这个递归的心思吧。以前倒是没注意这方面的,看样自己还得注意些