【发布时间】:2019-10-13 05:09:03
【问题描述】:
我正在尝试根据给定的球杆长度计算我需要进行的最少击球次数。您也可以将其视为给定零钱所需的最少硬币数量。
我的代码是
public static int golf(int holeLength, int[] clubLengths)
{
return golf(holeLength, clubLengths, 0);
}
public static int golf(int holeLength, int[] clubLengths, int shots)
{
if(holeLength==0)
shots+=0;
else if(holeLength<0)
shots=-1;
else
{
for(int i = 0; i<clubLengths.length; i++)
{
return golf(holeLength-clubLengths[i], clubLengths, shots+1);
}
}
return shots;
}
这里的问题是它似乎只根据数组上的第一个数字给出答案。因此,例如,如果我有 {25,50,100} 并且我想达到 100。显然,只需要最少一次,但程序只会使用 25 来计算它并说 4。同样,如果第一个数字是 21,那么它只会给出一个 stackoverflow。
【问题讨论】:
-
它只检查第一个数字,因为 for 循环中的唯一指令是返回,因此在第一次迭代时它将返回并取消所有剩余的迭代。你需要重新考虑你的逻辑(我不太确定你想用这个数组实现什么)
-
我的不好再读一遍就清楚了。您可以尝试在 for 循环中,或者从数组中的最大值开始,如果它是有序的,并检查它是否小于holelenght,或者可能不使用 return 并将结果放在一个临时变量中,并在循环中的每次迭代中尝试它并且只返回最小的镜头
-
我试图不使用 return 而是使用 if 来比较每个镜头数量并且只存储最小的镜头,但它不会改变任何东西。所以我的新 for 循环是
for(int i = 0; i<clubLengths.length; i++) { tempShots += 1+golf(holeLength-clubLengths[i], clubLengths, shots+1); if(tempShots<=result) result=tempShots; }