簡體   English   中英

遞歸 java 程序不返回任何值。 在 return 語句打印無限值之前放置一個打印語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM