[英]Recursive java program doesn't return any value. Putting a print statement right before the return statements prints infinite values
//inefficient recursive algorithm to find number of coins needed for a some amount
public class bitcoin {
public int mincoins;
public static void main(String[] args) {
int[] coins = {1, 5, 10, 21, 25};
int change = 63;
int min = 0;
min = MinCoins(coins, change);
System.out.println(min);
}
public static int MinCoins(int[] coins, int change) {
int mincoins = change;
int mincoins1 = 10000;
for (int j = 0; j <= coins.length - 1; j++) {
if (coins[j] == change) //base case
return 1;
}
//recursive call breaking into two sub problems
for (int i = 1; i <= (change) / 2; i++) {
mincoins1 = (MinCoins(coins, i) + MinCoins(coins, (change - i)));
if (mincoins1 < change)
mincoins = mincoins1;
}
return mincoins;
}
}
正如您的評論所暗示的那樣,這是一種低效的遞歸算法。 但是通過稍微移動您的代碼,至少不會永遠循環。 相反,它最終找到了一個解決方案(並且對於我所做的所有測試,它都找到了最佳硬幣計數)。
您錯過的部分是失敗退出標准。 在這個例子中:
If the coin sum is more than 'change', give up.
(For example, if you have already added 3 coins with value 25 (total 75), there are no
coins that can help you reach 63, so stop trying to find them.)
這個 if 語句(見下文)處理退出失敗:
if (change - coins[j] >= 0)
public static int MinCoins(int[] coins, int change) {
int mindepth = 10000;
for (int j = 0; j < coins.length; j++) {
if (coins[j] == change) {
return 1; // end case
} else if (change - coins[j] >= 0) {
int depth = 1 + MinCoins(coins, change - coins[j]);
if (depth >= 0 && depth < mindepth) {
mindepth = depth;
}
}
}
return mindepth;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.