我写了一个bisect函数,它带有一个单词列表" t"和一个词" val"。它递归地将列表减半,直到列表的索引为单词或返回false。如果它找到了这个词,它应该返回它。
我在这里阅读了多本书,文档和所有适用的问题,但我仍然无法确定我做错了什么:为什么该函数不会返回值?它会打印正常的值,但除了None之外没有返回。
非常感谢任何帮助!
def bisect(t, val):
if t[len(t)/2] < val and len(t) > 1:
t = t[len(t)/2:]
bisect(t, val)
elif t[len(t)/2] > val and len(t) > 1:
t = t[:len(t)/2]
bisect(t, val)
elif t[len(t)/2] == val:
t = t[len(t)/2]
#print type(t), t
return t
else:
return False
b = make_list(t)
x = bisect(b, 'and')
print x
答案 0 :(得分:1)
这里的主要问题是你需要从每次调用返回t
到递归调用的函数。使用下面的修改代码描绘调用堆栈:
def main():
b = ['a', 'able', 'ability', 'abort', 'and', 'arc', 'zygote']
x = bisect(b, 'and')
print x
def bisect(t, val):
if t[len(t)/2] < val and len(t) > 1:
t = t[len(t)/2:]
t = bisect(t, val)
elif t[len(t)/2] > val and len(t) > 1:
t = t[:len(t)/2]
t = bisect(t, val)
elif t[len(t)/2] == val:
t = t[len(t)/2]
print type(t), t
else:
return False
return t
if __name__ == '__main__':
main()
第一次调用bisect时,t设置为['abort', 'and', 'arc', 'zygote']
。
在第二次调用bisect时,t设置为['abort', 'and']
在第三次调用时,我们找到'and'
,并返回该值。
IF 你按原样返回(仅从完全匹配或False结果返回),然后返回第二个调用(['abort', 'and']
),然后是第一个调用({{ 1}}),最后在第一次调用中返回而不点击['abort', 'and', 'arc', 'zygote']
。因此,没有任何回报。
像我一样重写原始代码,在找到匹配项之前一切都是一样的。但是,使用我的代码,最后一次调用会将return t
返回到第二次调用中使用的t
变量。它将值返回给第一个调用,它将结果返回给调用代码。
希望这能解决你的问题。
答案 1 :(得分:0)
此修改版本有效:
def bisect(t, val):
mid = len(t)//2
mid_ele = t[mid]
end = len(t)
if mid_ele < val and end > 1:
t = t[mid:]
return bisect(t, val)
elif mid_ele > val and end > 1:
t = t[:mid]
return bisect(t, val)
elif mid_ele == val:
t = mid_ele
return t
else:
return False
b = ['she', 'he', 'you', 'and', 'me']
print(bisect(b, 'and'))
打印所需的:
and
我使用//
进行整数除法的Python 3证明,并在递归调用之前添加了两个returns
。