递归堆栈溢出/无限循环问题

时间:2014-11-26 00:17:19

标签: java recursion stack-overflow infinite-loop backtracking

我希望有人可以帮我解决我的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和递归的新手,所以请耐心等待。谢谢!!

1 个答案:

答案 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);