如何在没有使用'<'的情况下递归编写一种方法来检查数字是否小于另一个数字?运营商?
x
和y
将始终为0或更高boolean
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);
}
答案 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应为:
使用右移运算符,我们可以在 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;