0

现在,我为 Python(2.7 版)编写了二进制搜索。有时,它工作得很好,但有时它返回 None,尽管搜索的值在数组中。我已经尝试了每一种简单的方法来解决这个问题:我检查了函数返回的变量是否已定义,是否执行了 return 语句所在的工作流分支。并且:定义了变量执行了分支。

这是代码:

def binarySearch( array, desiderata, iMin, iMax ):
# Returns the index of the first instance of what we search
print 'min'
print iMin
print 'max'
print iMax

# If our search array is empty
if ( iMin > iMax ):
    return None

midP = (iMin + iMax)/2
curre = tapeNr( array[midP][TAPE_NUMBER] )
final = tapeNr( desiderata )
print 'curre'
print curre
print 'final'
print final
print 'midP'
print midP

if ( curre < final ):
    # print midP
    print "t: " + array[midP][TAPE_NUMBER] + ", d: " + desiderata
    binarySearch( array, desiderata, midP + 1, iMax )

else:
    if ( curre > final ):
        # print midP
        print "t: " + array[midP][TAPE_NUMBER] + ", d: " + desiderata
        binarySearch( array, desiderata, iMin, midP - 1 )

    else: 
        print 'hooray'
        # Now, find the first occurence of the value I need
        i = midP
        while ( array[i][TAPE_NUMBER] == desiderata ):
            i -= 1
            print i
        print (i + 1)
        return (i + 1)

由于我的调试,有很多“打印”语句。最后一个,'print (i+1)',实际上打印 (!) 我需要的东西的索引值,但函数仍然返回 None。

你知道问题的根源吗?

4

1 回答 1

5

您忽略递归调用的返回值:

binarySearch( array, desiderata, midP + 1, iMax )

binarySearch( array, desiderata, iMin, midP - 1 )

所以什么curre < final时候True

if ( curre < final ):
    # print midP
    print "t: " + array[midP][TAPE_NUMBER] + ", d: " + desiderata
    binarySearch( array, desiderata, midP + 1, iMax )

你调用binarySearch()之后你的函数结束。如果没有显式返回,这意味着您的函数返回值被设置为None

return在这些行中添加语句:

return binarySearch( array, desiderata, midP + 1, iMax )

# ...

return binarySearch( array, desiderata, iMin, midP - 1 )
于 2013-07-16T14:48:18.837 回答