100以内所有可以加为100的整数的组合

theoffspring 2009-09-02 12:05:58
import java.util.LinkedList;   

/**
* 100以内所有可以加为100的整数的组合。<br>
* 此处以10为例子。<br>
* 思路是,拿到第一个数,然后把后面的递归解析,<br>
* 原则后面的数不能小于当前这个数<br>
* 且不大于结果减去当前数.<br>
* <br>
* 比如 10,技术从0开始,则当前数为1,被递归解析数为9<br>
* 递归的起点为1,保证1不会再被解析。
*
* @author jayflee,老紫竹 java2000.net
*
*/
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) {
System.out.println(list);
return;
}
for (int i = base + 1; i <= n; i++) {
list.addLast(i);
split(n - i, i);
list.removeLast(); //这行看不懂,为什么要删除最后一个元素?
}
}

}
...全文
664 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanliang_xt 2009-09-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/yanliang_xt/archive/2009/09/02/4512988.aspx
开始也觉得不好理解。然后画了下图思路就感觉清晰多了。。


为什么要list.remove() 因为你最近加的这个数不满足要求(也就是你加进去的这个数使得最终结果大于100了),它是罪魁祸首,那你说还把它留在上面干嘛,所以就剔除它,再拿其它的数去试探。
24K純帥 2009-09-03
  • 打赏
  • 举报
回复
学习了
liuxiaohui1987 2009-09-03
  • 打赏
  • 举报
回复
都是高手啊!!!!
zhoujingxian 2009-09-03
  • 打赏
  • 举报
回复
还是老紫竹自己解释比较清晰
hui94781674 2009-09-02
  • 打赏
  • 举报
回复
mark...
老紫竹 2009-09-02
  • 打赏
  • 举报
回复
这个List用堆栈更形象一些。

  public static void main(String[] args) {
split(11, 0);
}

static Stack<Integer> list = new Stack<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.push(i);
split(n - i, i);
list.pop();
}
}
老紫竹 2009-09-02
  • 打赏
  • 举报
回复
整体思路在说明一次
1 先放入一个数,从1开始到最大允许的数
2 将总数减去已经放入的数,计算为余数
3 对余数再次进行分解,但新分解的数不能小于当前已经放入的数
4 如果分解完毕,则取回已经放入的数,放下一个更大的数
看看结果
[1, 2, 3, 4]
[1, 2, 7]
[1, 3, 6]
[1, 4, 5]
[1, 9]
[2, 3, 5]
[2, 8]
[3, 7]
[4, 6]
[10]
老紫竹 2009-09-02
  • 打赏
  • 举报
回复
晕,看来我下次得把注释写清楚些。
bigbug9002 2009-09-02
  • 打赏
  • 举报
回复
递归算法中常见的问题.

for (int i = base + 1; i <= n; i++)
这个for循环的意思就是依次把i,放到List中,再进行一下次划分。
list.removeLast()就是把list.add(i)加进去的i,取走,下一次才能放进i+1去啊,否则,i还留着,逻辑不对了。
goodmrning 2009-09-02
  • 打赏
  • 举报
回复
好帖!
feishare 2009-09-02
  • 打赏
  • 举报
回复
mark
theoffspring 2009-09-02
  • 打赏
  • 举报
回复
list.removeLast(); //这行看不懂,为什么要删除最后一个元素?
samihyypia 2009-09-02
  • 打赏
  • 举报
回复
mark
bigbug9002 2009-09-02
  • 打赏
  • 举报
回复
我把循环结构变成了顺序结构。把split(10,0)变成了split(4,0)
如果没有list.removeLast()程序逻辑是不是不对?
yanliang_xt 2009-09-02
  • 打赏
  • 举报
回复
bigbug9002

哇。。得 红 了。。
恭喜。。
bigbug9002 2009-09-02
  • 打赏
  • 举报
回复
hbgzg3006 2009-09-02
  • 打赏
  • 举报
回复
假设 求3//注意list是static的
循环以1开始的结果 add(1) (2,1)循环结束后-> remove(1) 由于递归且1不能再循环 去循环(2,1)
add(2) 循环(0,2)结束后-> remove(2)
由于递归优先先去循环(0,2),n=0返回 remove(2),再返回 再去remove(1)
结果list中是(1,2)

其实主要原因是比如求5(注意加入进来和删除是成对的,如果能循环到0证明有结果 也就不会成对了), 求出1,2,3 如果以1开始的还有其他(1,4)就求出 如果没有程序不会循环到0也就不会return 然后1就会被从list中去掉 开始循环2开始的 同样的道理
lya046 2009-09-02
  • 打赏
  • 举报
回复
递归,
list.removeLast();就是说要么不符合for循环,要么执行return语句返回来。
dudubank 2009-09-02
  • 打赏
  • 举报
回复
这个程序能跑出结果来吗?
ctlu2ct2t 2009-09-02
  • 打赏
  • 举报
回复
这个程序已经解决问题了?!输出的结果在那里?!100个数?!
加载更多回复(14)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧