贴一 个 以前写的public class T { public static void main(String[] args) { split(20, 0); } static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) { if (n == 0) { System.out.println(list); return; } for (int i = base + 1; i <= n; i++) { list.addLast(i); split(n - i, i); list.removeLast(); // 这行看不懂,为什么要删除最后一个元素?[/color] } }}
改一下,重复的数字 可以吗?public class T { public static void main(String[] args) { split(10, 0); } static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) { if (n == 0) { if(list.size() == 1) { return; } System.out.println(list); return; } for (int i = base + 1; i <= n; i++) { list.addLast(i); split(n - i, i);//split(n - i, i-1),要重复就用这个递归 list.removeLast(); // } }}
加个限制条件就行了i <= n & i <= 30static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n,int base){ if(n == 0){ System.out.println(list); return; } for(int i = base + 1;i <= n & i <= 30;i++){ list.addLast(i); split(n - i,i); list.removeLast(); // 这行看不懂,为什么要删除最后一个元素 } } public static void main(String[] args){ split(50,0); }
在 加 1个条件 呗。 public class T { public static void main(String[] args) { split(50, 0); } static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) { if (n == 0) { if(list.size() == 1) { return; } if( list.getLast() > 30) { return; } System.out.println(list); return; } for (int i = base + 1; i <= n; i++) { list.addLast(i); split(n - i, i); list.removeLast(); // } }}
public static void main(String[] args) {
split(20, 0);
} static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) {
if (n == 0) {
System.out.println(list);
return;
}
for (int i = base + 1; i <= n; i++) {
list.addLast(i);
split(n - i, i);
list.removeLast(); // 这行看不懂,为什么要删除最后一个元素?[/color]
}
}}
public static void main(String[] args) {
split(10, 0);
} static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) {
if (n == 0) {
if(list.size() == 1)
{
return;
}
System.out.println(list);
return;
}
for (int i = base + 1; i <= n; i++) {
list.addLast(i);
split(n - i, i);//split(n - i, i-1),要重复就用这个递归
list.removeLast(); //
}
}}
if(n == 0){
System.out.println(list);
return;
}
for(int i = base + 1;i <= n & i <= 30;i++){
list.addLast(i);
split(n - i,i);
list.removeLast(); // 这行看不懂,为什么要删除最后一个元素
}
} public static void main(String[] args){
split(50,0);
}
public static void main(String[] args) {
split(50, 0);
} static LinkedList<Integer> list = new LinkedList<Integer>(); public static void split(int n, int base) {
if (n == 0) {
if(list.size() == 1)
{
return;
}
if( list.getLast() > 30)
{
return;
}
System.out.println(list);
return;
}
for (int i = base + 1; i <= n; i++) {
list.addLast(i);
split(n - i, i);
list.removeLast(); //
}
}}
不过我想看看还有没有其他算法了?晚会再结贴吧呵呵
至于n的确定,也很简单,如1-100 的数由1-30来表示,n = 3
效率 在某些时候是不错
跟你这个 差不多
http://topic.csdn.net/u/20090925/23/cac629c6-3bdb-4422-afe4-3e2e88a97539.html