这肯定是不正确的。
由于您忽略了递归调用的返回值,因此您的程序实际上只检查是否A[m] == m
在您的第一次调用中,-1
如果不是则返回。
“显而易见”的解决方案类似于:
public static int IndexSearch(int []A, int l, int r) {
for i in range(1, length(A))
if (A[i] == i)
return i
return -1
}
这也是一个非常明确的解决方案,所以也许这比更复杂的解决方案更受欢迎。
很抱歉,我无法帮助您解决其他问题。
编辑:这应该工作。它是用 Python 编写的,但应该很容易理解。分而治之的关键是将问题减少到解决方案显而易见的程度。在我们的例子中,这将是只有一个元素的列表。这里唯一的困难是传回返回值。
def index(l, a, b):
if a == b: #The basecase, we consider a list with only one element
if l[a] == a:
return a
else: return -1
#Here we actually break up
m = (a+b)/2
i1 = index(l, a, m)
if i1 != -1:
return i1
i2 = index(l, m+1, b)
if i2 != -1:
return i2
return -1
这是一个示例输出:
l = [1,2,3,3,5,6,7,8,9]
print index(l, 0, len(l)-1)
Output: 3
希望有帮助。
编辑:找到所有的事件实际上会导致一个更好的解决方案:
def index(l, a, b):
if a == b:
if l[a] == a:
return [a]
else:
return []
m = (a+b)/2
return index(l, a, m) + index(l, m+1, b)
输出如下:
l = [1,2,3,3,5,6,7,8,8]
print "Found " , index(l, 0, len(l)-1), " in " , l
Found [3, 8] in [1, 2, 3, 3, 5, 6, 7, 8, 8]
和
l = range(0,5)
print "Found " , index(l, 0, len(l)-1), " in " , l
Found [0, 1, 2, 3, 4] in [0, 1, 2, 3, 4]
我认为这是一个不错的、纯粹的解决方案;-)