这里我正在研究以下问题,其中我们给出了n种值的硬币面值v(1) > v(2) > ... > v(n) (all integers)
以下代码试图找出制作总和所需的最小硬币数量 - C。这里的C是100(参见main函数)。当我运行代码时,出现错误 - “java.lang.StackOverflowError”。请帮忙。
import java.util.ArrayList;
public class Problem2 {
public static int count=4;
public static int []v={25,10,5,1}; //Array storing denominations
private static int findminimum(ArrayList<Integer> v2) {
int count=v2.get(0);
for(int i=0;i<v2.size();i++)
{
if(count>v2.get(i))
{
count=v2.get(i);
}
}
return count;
}
public static int countmincoins(int n)
{
int t;
if(n<0)
{
t=Integer.MAX_VALUE-100 ;
}
if(n==0)
{
t= 0;
}
else
{
ArrayList<Integer> a=new ArrayList<Integer>();
for(int i=0;i<v.length;i++)
{
int temp=0;
temp=countmincoins(n-v[i])+1; //Stackoverflow error
a.add(temp);
}
t=findminimum(a);
}
return t;
}
public static void main(String args[])
{
System.out.println(countmincoins(100));
}
}
答案 0 :(得分:0)
如果您不限制使用递归,则以下内容会更简单:
public static int[] denominations = {25,10,5,1};
public static int minimumCoins(int amount){
int total = 0;
for(int denomination: denominations){
while(amount - denomination >= 0){
amount -= denomination;
total++;
}
}
return total;
}
public static void main(String args[])
{
System.out.println(minimumCoins(98));
}
答案 1 :(得分:0)
如果使用递归,则需要达到终止递归的条件。但是在你的代码中我没有看到任何终止逻辑。这就是为什么,它得到无限循环和StackOverflowException。在您的代码中,您使用以下代码来终止。
if(n==0)
{
t= 0;
}
但这里n可能不是零。因为countmincoins(n-v[i])
不能确保你将为0。
答案 2 :(得分:0)
您的代码是无限的,t
永远不会是<0 or ==0
,因为数组中的值和条件(n - v[i] )+1
,v[i]
将始终返回相同的值调用方法,因此无限递归。