Using a recursive bisection algorithm to check if character is in string
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Dreaming in Puzzles
--
Chapters
00:00 Using A Recursive Bisection Algorithm To Check If Character Is In String
01:13 Accepted Answer Score 6
02:11 Answer 2 Score 5
02:36 Answer 3 Score 0
02:54 Answer 4 Score 2
03:10 Thank you
--
Full question
https://stackoverflow.com/questions/2110...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #recursion #bisection
#avk47
ACCEPTED ANSWER
Score 6
The function is never returning True. I think it should return True when char == m, so you could delete it from the if-clause(that is returning False) and put it in another if:
if char == m:
   return True
elif aStr == '' or len(aStr) == 1:
    return False
else:
    ...
Also, you are calling isIn method which is not defined. I think you wanted to recursively call isitIn.
After comparing char < m and char > m you should "bisect" the string, so don't do return isitIn(char, aStr[:-1]) nor return isIn(char, aStr[1:]), instead pass (in the recursive call) the "half" of the string.
if char < m:
    return isitIn(char, aStr[:len(aStr) // 2])
elif char > m:
    return isitIn(char, aStr[len(aStr) // 2:])
Edit: Just in case, the code I've tried is:
def isitIn(char, aStr):
    if aStr == '':  # Check for empty string
        return False
    m = aStr[len(aStr) // 2]
    if char == m:
       return True
    elif len(aStr) == 1:
        return False
    else:
       if char < m:
           return isitIn(char, aStr[:len(aStr) // 2])
       elif char > m:
           return isitIn(char, aStr[len(aStr) // 2:])
    return isitIn(char, aStr)
ANSWER 2
Score 5
Overall, your code looks pretty good. But I would take a closer look at your first if statement. In particular, you're checking to see if the char is equal to the middle char. What would you want to return if your character was equal to the middle character?
Also, you need to make sure that all paths can be reached by your algorithm. Under what conditions would True be returned by your function?
ANSWER 3
Score 2
this also works. slightly shorter as well:
def isIn(char, aStr):
    if len(aStr)==0:
        return False
    elif len(aStr)==1:
        return char == aStr
    elif char == aStr[len(aStr)//2]:
        return True
    else:
        if char < aStr[len(aStr)//2]:
            return isIn(char, aStr[0:len(aStr)//2])
        elif char > aStr[len(aStr)//2]:
            return isIn(char, aStr[len(aStr)//2:]) 
    return isIn(char, aStr)
ANSWER 4
Score 0
I think this code can work properly, just I sorted the string before checking for character 'm':
def isitIn(char, aStr):
b = ''
if aStr == '':  # Check for empty string
    return False
b = sorted(aStr)
m = b[len(b) // 2]
if char == m:
   return True
elif len(b) == 1:
    return False
elif char < m:
       return isitIn(char, b[:len(b) // 2])
else:
       return isitIn(char, b[len(b) // 2:])
return isitIn(char, aStr)