如何在不使用运算符的情况下编写LessThan方法

时间:2017-10-22 03:30:37

标签: java math recursion integer integer-arithmetic

如何在没有使用'<'的情况下递归编写一种方法来检查数字是否小于另一个数字?运营商?

  1. 您只能使用加号,减号,次数和等于运算符。
  2. 必须是递归的
  3. xy将始终为0或更高
  4. 应该返回boolean
  5. 如果需要,您可以制定其他方法,但必须遵守上述规则。
  6. Cove我到目前为止:

    public static boolean isLessThan(int x, int y) { 
        if(x == y - 1) return true;
        if(x == y + 1) return false; 
        if(x == y) return false; 
    
        return isLessThan((x), (y-1)) || isLessThan((x-1), y);
    }
    

2 个答案:

答案 0 :(得分:6)

因为您通过编写自己的代码进行了善意的尝试,并且因为我认为这是一种谜题,所以我提供的代码只有一个递归调用,而不是两个递归调用在您的代码中调用。

我认为这在满足约束条件时非常简单。

它做什么:它将两个数字倒数到零,并检查哪一个先到零。如果两者同时达到零,则结果应该为false,但只是检查y是否为零已包含该检查。

public static boolean isLessThan(int x, int y) {
    if (y == 0) {
        return false;
    }
    if (x == 0) {
        return true;
    }

    return isLessThan(x - 1, y - 1);
}

@安德烈亚斯'答案比上述更有效。我的目标最初是为了一个简短,干净的答案。 我试图创建一个更短的比特移位方法。 虽然比计数示例更难掌握,但它具有更好的复杂性,并且它具有与上述代码相同的行数(我不计算该常量,因为我可以将其包含在代码中而牺牲可读性)

请注意,此代码向左移动而不是向右移动 - 它首先检查最高有效位。

public static final int HIGH_BIT = 1 << 31;

public static boolean isLessThan(int x, int y) {
    if (x == y) {
        return false;
    }
    if ((x & HIGH_BIT) != (y & HIGH_BIT)) {
        return (y & HIGH_BIT) == HIGH_BIT;
    }
    return isLessThan(x << 1, y << 1);
}

注意:如果不允许!=,您可以将第二个if语句更改为:

if (((x ^ y) & HIGH_BIT) == HIGH_BIT)

另请注意,复杂度实际上是O(1),尽管算法理论上是O(log n),但Java ints是32位,因此上限是O(32),它与{O(1)相同1}}。

答案 1 :(得分:2)

你可以像这个问题的答案那样做:
Bitwise operations equivalent of greater than operator

然而,这并不符合规则2:它必须是递归的。

根据comment,规则1应为:

  1. 您只能使用 plus 减去乘以等于按位运营商。
  2. 使用右移运算符,我们可以在 O(log n)时间内获得解决方案,而不像answer by Erwin Bolwidt那样< em> O(n)时间,可能会导致StackOverflowError

    public static boolean isLessThan(int x, int y) {
        return compare(x, y) == -1;
    }
    
    private static int compare(int x, int y) {
        if (x == y)
            return 0;  // x == y
        if (x == 0)
            return -1; // x < y
        if (y == 0)
            return 1;  // x > y
    
        // Compare higher bits. If different, then that is result
        int cmp = compare(x >> 1, y >> 1);
        if (cmp != 0)
            return cmp;
    
        // Only bit 0 differs, so two choices:
        //   x0 == 1 && y0 == 0 -> return 1
        //   x0 == 0 && y0 == 1 -> return -1
        return (x & 1) - (y & 1);
    }
    

    如果不允许!=,可以将代码更改为:

    // same code up to and including recursive call
    if (cmp == 0)
        return (x & 1) - (y & 1);
    return cmp;