我希望有人可以帮我解决我的Stack Overflow / Infinite-loop错误问题,希望能指出正确的方向。我的程序旨在显示所有以特定金额回馈给用户的变更(以金钱换货)的解决方案。算法是这样的:
Subtract a coin amount from the total change value. If you get back 0,
then is a solution
If negative, discard that coin.
If you try a nickle and it doesn't work, un-choose it, try a penny
这是我到目前为止所拥有的
import java.io.*;
import java.util.*;
import java.lang.*;
public class homework5 {
public static int change;
public static void main(String[] args)
throws FileNotFoundException { //begin main
ArrayList<Integer> coinTypes = new ArrayList<Integer>();//array to store coin types
ArrayList<Integer> answerCoins = new ArrayList<Integer>();//answer to be outputted
Integer i;
File f = new File (args[0]);
Scanner input = new Scanner(f); //initialize scanner
input.nextLine();
while(input.hasNextInt()) {
i = input.nextInt();
coinTypes.add(i); //add all ints to file
}
change = coinTypes.get(coinTypes.size()-1);
coinTypes.remove(coinTypes.size()-1);
System.out.println("Change: " + change);
findChange(change, coinTypes, answerCoins);
}
private static void findChange(int change, List<Integer> coinTypes, List<Integer> answerCoins) {
//contains means of finding the
//change solutions
if(change == 0) {
//base case
System.out.println(answerCoins);
}
else if(change < 0) {
//if negative it can't be a solution
} else {
for(int coin = 0; coin < coinTypes.size(); coin++) {
answerCoins.add(coinTypes.get(coin)); //choose
findChange(change-coinTypes.get(coin), coinTypes, answerCoins);//explore
answerCoins.remove(answerCoins.size()-1); //un-choose
}
}
}
}
正如我所提到的,程序从文件中读取值,这是我使用的测试文件
// Coins available in the USA, given in cents. Very simple case.
1 5
9
在阅读完文件后,我的ArrayList
coinTypes
将包含[1, 5]
,static int
change
将等于9
。因此,main findChange
下面的递归算法将计算所有不同的方法,只需要一分钱和一个镍币就可以赚到0.09美元,因此所有便士应该是最后的解决方案输出。但是,我在for循环中出错,我似乎无法修复它,这是我的输出
输出更新
Change: 9
[1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 5]
[1, 1, 1, 5, 1]
[1, 1, 5, 1, 1]
[1, 5, 1, 1, 1]
[5, 1, 1, 1, 1]
正如你所看到的,它确实可以解决问题,但只有前两个是重要的,有任何想法要解决吗?
WANT
Change: 9
[1 1 1 1 5]
[1 1 1 1 1 1 1 1 1]
感谢您的时间和精力,感谢您的所有答案,如果您需要其他信息,请告诉我们。请记住,我是java和递归的新手,所以请耐心等待。谢谢!!
答案 0 :(得分:1)
在你的函数findChange中,int coin
是一个索引。您正在使用行中的索引:
answerCoins.add(coin);
而不是coinTypes列表的值,所以你的第一次尝试是用0美分的硬币,因此无限循环,尝试改为:
answerCoins.add(coinsType.get(coin));
您还需要更改硬币的任何其他用途,例如在行中:
findChange(change - coin, coinsType, answerCoins);
到
findChange(change - coinsType.get(coin), coinsType, answerCoins);