找到从 x 到 y

问题描述

仍在为递归而苦苦挣扎。 我有一个代码,它应该让我进行最少的操作,以便从 x 到 y。 只能乘以 2 或加 +1 例如从 7 到 12 ......它的 5 次操作,因为你需要 +1 五次。 我的代码无法正常工作,我无法弄清楚我缺少什么才能使其正确。

public static int minops(int x,int y)
{
    if (x >= y) return 0;
        int add = 1 + minops(x + 1,y);
        int mul = 1 + minops(x * 2,y);
    return Math.min(add,mul);
}

解决方法

您没有考虑到超调是不合法的,因此返回 0 是不正确的。只需在您的基本情况下更改以下内容

if(x > y) return Integer.MAX_VALUE;
if(x == y) return 0;
,

@arjunkhera's answer 有正确的想法——当你超量时返回一个“可怕的”结果,所以你永远不要选择它——但需要避免在结果中加 1 时潜在的溢出:

public static int minOps(int x,int y)
{
    // Return 1 less that MAX_VALUE,so adding 1 doesn't overflow.
    // You'll never get as far as here anyway,your stack will overflow long
    // before,so subtracting 1 makes no practical difference.
    if (x > y) return Integer.MAX_VALUE - 1;
    if (x >= y) return 0;

    int add = 1 + minOps(x + 1,y);
    int mul = 1 + minOps(x * 2,y);
    return Math.min(add,mul);
}

或者,您可以推迟添加 1 到以后:

    if (x > y) return Integer.MAX_VALUE;
    if (x >= y) return 0;

    int add = minOps(x + 1,y);
    int mul = minOps(x * 2,y);
    return 1 + Math.min(add,mul);

因为至少 addmul 之一不等于 MAX_VALUE