2016-09-18 4 views
0

Dieser Code führt eine rekursive Halbierungssuche nach einem Zeichen in einer Zeichenfolge aus. Wenn die Anweisung nicht ausgelöst wird

Wenn die print Aussagen nicht kommentiert heraus, so scheint es gut mit der Rekursion und bisection zu arbeiten, aber die if Anweisung, die True kehrt scheint nicht zu schießen.

def isIn(char, aStr): 
    ''' 
    char: a single character 
    aStr: an alphabetized string 

    returns: True if char is in aStr; False otherwise 
    ''' 
    b = sorted(aStr) 
    c = len(aStr) 
    # print("string b " + str(b)) 
    # print("c " + str(c)) 
    # print("element middle: " + str(b[round(c/2)])) 
    #print("char: " + str(char)) 
    #print(str(char) == str(b[round(c/2)])) 
    if ((str(char) == str(b[round(c/2)]))): # this if statement does not seem to fire 
     return True 
    elif (c == 1 and char != str(b[round(c/2)])) or (c == 0 and char != "") : 
     return False 
     #print("false") 
    else: 

     #if str(char) == str(b[round(c/2)]): 
     # return True 
      # print("true") 
     if char > b[round(c/2)]: 
      isIn(char, b[round(c/2):c]) 

     elif char < b[round(c/2)]: 
      isIn(char, b[0:round(c/2)]) 
     else: 
      return False 
      #print('fales') 
+3

Achten Sie darauf, es richtig – Li357

+0

Mit „nicht ausgelöst“ eingekerbt, meinen Sie, dass die Bedingung 'str (char) == str (b [rund (c/2)])' wird nicht zu 'True' ausgewertet? Wenn Einrückung das Problem ist, ist diese Frage ein strittiger Punkt. –

+0

Ein Betrogener? http://stackoverflow.com/questions/15210646/i-expect-true-but-get-none –

Antwort

1

Sie müssen das Ergebnis jedes rekursiven Aufrufs zurückgeben.

Dies ist ein sehr häufiger Fehler, aus irgendeinem Grund.

0

Sie sollten round in keiner der Berechnungen verwenden, da Sie dann einen float anstelle eines int als Index für die Zeichenfolge verwenden.
Verwendung int statt:

str(b[int(c/2)])) 
0

Dieser Code funktioniert hat, bevor die rekursive Funktion Rückrufe:

def isIn(char, aStr): 
''' 
char: a single character 
aStr: an alphabetized string 

returns: True if char is in aStr; False otherwise 
''' 
b = sorted(aStr) 
c = len(aStr) 
# print("string b " + str(b)) 
# print("c " + str(c)) 
# print("element middle: " + str(b[round(c/2)])) 
#print("char: " + str(char)) 
#print(str(char) == str(b[round(c/2)])) 
if ((str(char) == str(b[int(c/2)]))): # this if statement does not seem to fire 
    return True 
elif (c == 1 and char != str(b[round(c/2)])) or (c == 0 and char != "") : 
    return False 
    #print("false") 
else: 

    #if str(char) == str(b[round(c/2)]): 
    # return True 
     # print("true") 
    if char > b[round(c/2)]: 
     return isIn(char, b[round(c/2):c]) 

    elif char < b[round(c/2)]: 
     return isIn(char, b[0:round(c/2)]) 
    else: 
     return False 
     #print('fales') 
+0

Du wirst alle 'runden' Anweisungen in' int' ändern müssen. Es ist mir nicht in den Sinn gekommen, dass du nur die erste ändern würdest. Und während Sie editieren, ändern Sie bitte die letzte Anweisung in '#print ('fails')' '. Nur ein leichter Ärger. –

Verwandte Themen