难以理解二分搜索和递归

时间:2017-06-29 23:46:56

标签: python recursion bisection

这是我试图解决的问题:

  

我们可以使用二分搜索的概念来确定一个角色   只要字符串按字母顺序排序,就在字符串中。

     

首先,针对角色测试字符串的中间字符   你正在寻找(“测试角色”)。如果它们是相同的,我们   完成了 - 我们找到了我们正在寻找的角色!

     

如果它们不相同,请检查测试字符是否“小于”   中间人物。如果是这样,我们只需考虑下半部分   字符串;否则,我们只考虑字符串的上半部分。   (请注意,您可以使用Python的< function来比较字符。)

     

实现实现上述功能的函数isIn(char,aStr)   递归地想要测试char是否在aStr中。 char将是一个单一的   character和aStr将是一个按字母顺序排列的字符串。该   function应该返回一个布尔值。

     

在设计功能时,请仔细考虑基础   案件应该是。

这是我试图做的代码。我遇到了错误,但是我在理解如何解决这个问题的基础知识方面落后了。

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

    returns: True if char is in aStr; False otherwise
    '''
    # Your code here
    middle_char = len(aStr)/2
    if char == middle_char:
        True
    elif char == "" or char == 1:
        False
    elif char < aStr[:middle_char]: 
        return isIn(char,aStr(middle_char)
    else: 
        return isIn(char, aStr(middle_char))

2 个答案:

答案 0 :(得分:2)

你落后的一个原因是,当你还没有掌握写简单的陈述时,你正试图写一个递归函数。这里有大约10行活动代码,包括至少4个语法错误和2个语义错误。

退出并使用增量编程。写几行代码,测试它们,然后不要前进,直到你确定它们按预期工作。插入诊断print语句以便随时检查值。例如,从强制馈送值开始,没有实际的函数调用,如下所示:

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

returns: True if char is in aStr; False otherwise
'''

char = 'q'
aStr = "abcdefghijklmnopqrstuvwxyz"
print "parameters:", char, aStr

middle_char = len(aStr)/2
print len(aStr), middle_char

print "if", char, "==", middle_char, ":"

这为您提供了输出

parameters: q abcdefghijklmnopqrstuvwxyz
26 13
if q == 13 :

显然,一个字符将等于整数13。 在你继续前进之前解决这个问题。 然后您可以尝试实际编写第一个if语句。

看看它是如何工作的?

答案 1 :(得分:0)

middle_char = len(aStr)/2
 if char == middle_char:

中间字符是长度的一半(即整数值) 它不会等于你的char值。

middle_index = len(aStr)//2
middle_char = aStr[middle_index]

实际得到中间的char值。注意整数除法(//)。我们想确保结果索引是一个整数。

elif char == "" or char == 1:

你已经测试过(很好地试过)剩下一个字符的情况,你不需要专门处理它。您还需要在尝试提取值之前测试空字符串

elif char < aStr[:middle_char]: 

这里你实际上尝试并索引到字符串。不幸的是,你实际上正在做的是切片,看看字符串的中间字符(中间字符向前)是否等于你的char。如果你正在查看一个字符串,这只会匹配。例如isin('d', 'd')

    return isIn(char,aStr(middle_char)
else: 
    return isIn(char, aStr(middle_char))

- 第一次返回)时缺少括号   - aStr()不是函数。您需要[]   - 你试图只传递一个char进入递归调用。您需要对字符串进行切片并将生成的子字符串传递给递归字符串   - 这两个(忽略缺少的括号)都是相同的调用。你需要一个用aStr的前半部分和下半部分的一个来打电话。

你的任务是考虑基本情况。他们是(我列出他们因为你几乎让他们看到了):   - 空字符串(返回False)   - mid char = search char(return True)   - 中间字符&gt;搜索字符(搜索左子字符串)   - 中间字符&lt;搜索字符(搜索右子字符串)

请注意,不需要显式检查长度为1的非匹配字符串,因为这会将空字符串传递给下一个调用

你要考虑的事情:为什么需要对字符串进行排序?如果字符串没有排序会发生什么?

工作实施:

def isin (char, str):
    if not str: 
        return False
    mid_index = len(str)/2
    mid_char = str[mid_index]
    return True if mid_char == char else isin(char, str[:mid_index] if mid_char > char else str[mid_index+1:])

不要只使用此代码。此代码仅供您参考,因此您可以了解它正在做什么,并在您理解后重写代码。如果您不理解它,那么复制代码是没有意义的。它将来不会帮助你。

你似乎对你需要做什么有了一般性的想法(我猜你已经在课堂上讨论了这个问题),但是在 how (语法等)方面缺乏知识。

我建议您在自己的时间内完成the python tutorial,并完成练习。它将依次向您介绍该语言的功能,这将对您有所帮助。

祝你好运!