java的大牛门进来帮忙一下 java如何实现递归比较

worinimab123 2011-08-21 01:06:43
java如何实现两个数最接近的比较 例如
public int getAdjacent(List <Integer>list,int x);

用list集合里面的元素值跟x比较,首先取单个元素计较,再取两个元素相加比较,直到N个元素相加比较,最后返回最接近x

的数,这个最接近x的数必须比x小,也就是单个比较的话首先先去掉大于x的元素再比较 ,如此类推,直到N个相加输去掉大

于X的数再比较如:

List xlist = new ArrayList();
for(int i=0;i<list.size();i++)
{
if(list.get(i)<x)
{
xlist.add(list.get(i))
}
}

最后用xlist元素的值跟x比较,并把返回的最接近X的值放入最接近X的set中, 如此类推 直到第N个元素相加最接近X的值放

入set中,此时set中保存的是由单个元素到N个元素相加最接近X的值,再用set值去比较 最终返回 最最接近

X的值组合,我想要的并不是一个最接近的数 ,我想要的是 所有数递归起来加起来 最接近比较值的数。假如

我的集合里面有1,2,3,6,7,11,100,200,33,31 比较值是50 我想要的是33、7、6、2、1 这个组合加起来

是最接近50的 当然也有别的组合 ,其实最接近比较数并且不大于比较数 那就是比较数-1了 这样就要返回 集

合里面的所有等于比较值-1的组合 这个组合就是我想要的 http://topic.csdn.net/u/20110820/21/eb866f36-e1ac-4ac9-b302-b87983e9d5c3.html 欢迎大家来回帖
...全文
94 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
owen10000 2011-08-21
  • 打赏
  • 举报
回复
本帖结果了 已经采纳 shuwei003 的答案 因为发了两个一样的贴所以次贴不打算结了 谢谢大家关注
shuwei003 2011-08-21
  • 打赏
  • 举报
回复
这个问题有点像背包问题,由于最接近50的组合可能有多种,我在每次有结果的时候都打印了一次,最后的结果是最后打印的那个set

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;


public class N110821 {

static private int dif; //当前最大组合的和
static private Set<Integer> results = new HashSet<Integer>(); //存放结果使用
static private int comNum; //比较数
static private List<Integer> iLists = new ArrayList<Integer>(); //需要筛选的list
static private int[] arr; //存放消除大于比较数后的list中的元素
static private LinkedList<Integer> tmp = new LinkedList<Integer>(); //存放临时结果
static boolean sign = false;

/*
* 参数:
* 1.当前数组下标
* 2.上一次调用后的和
* 返回值,当前数
*/
static void getNearestCom(int nIndex, int sum){
for(int i = nIndex; i >= 0; ){
i--;
if(i >= 0 && sum + arr[i] < comNum){
tmp.addLast(arr[i]);
sign = true;
getNearestCom(i, sum + arr[i]);
}else{
if(sign && sum >= dif){
dif = sum;
results.clear();
results.addAll(tmp);
System.out.println(results + "--------->" + dif);
sign = false;
}
if(i == -1)
{
if(!tmp.isEmpty())
tmp.removeLast();
}
}
}
}

static Set search(List<Integer> lists, int max){
comNum = max;
//先随便找一个比这个比较数小的数初始化
iLists.addAll(lists);
//去掉大于比较数的数
for(int i = 0; i < iLists.size(); i++){
if(iLists.get(i) >= comNum){
iLists.remove(i);
i--;
}
}
arr = new int[iLists.size()];
for(int i = 0; i < iLists.size(); i++){
arr[i] = iLists.get(i);
}
dif = arr[0]; //初始化dif
results.add(arr[0]);
getNearestCom(arr.length, 0);
return results;
}

public static void main(String[] args) {
List<Integer> lists = Arrays.asList(new Integer[]{1,2,3,6,7,11,100,200,33,31});
System.out.println("最后结果是:" + N110821.search(lists, 50));
}
}

62,614

社区成员

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

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