0

これで、Python (バージョン 2.7) のバイナリ検索を作成できました。正常に動作する場合もありますが、検索された値が配列にあるにもかかわらず None を返す場合もあります。これを修正するあらゆる簡単な方法を試しました。関数が返す変数が定義されているかどうか、return ステートメントがあるワークフローの分岐が実行されているかどうかを確認しました。And: 変数定義され、分岐実行されます。

コードは次のとおりです。

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()関数が終了した後に呼び出します。明示的な return がない場合、関数の戻り値がNone代わりに設定されます。

returnこれらの行にステートメントを追加します。

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

# ...

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