Vik*_*Vik 0 python recursion search
我正在尝试/需要编写一个递归函数,如果元素在排序列表中,则返回 True/False 值。我被要求不要使用“in”关键字来获得答案。我的代码如下,我想我很接近,但我似乎无法让函数返回正确的值:
def listSplitter(listToProcess, numToFind):
lenOfList = len(listToProcess)
if lenOfList == 1:
if numToFind == listToProcess[0]:
return True
else:
return False
else:
if lenOfList % 2 == 0:
list1 = listToProcess[0:int(lenOfList / 2)]
list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
if list1[-1] >= numToFind and list1[0] <= numToFind:
return (list1, numToFind)
#return
elif list2[-1] >= numToFind and list2[0] <= numToFind:
return listSplitter(list2, numToFind)
#return
else:
list1 = listToProcess[0:int(lenOfList / 2)]
list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
if list1[-1] >= numToFind and list1[0] <= numToFind:
return listSplitter(list1, numToFind)
#return
elif list2[-1] <= numToFind and list1[0] >= numToFind:
return listSplitter(list2, numToFind)
#return
def ordered_contains(S, x):
return listSplitter(S,x)
#result = listSplitter(S, x)
#return result
A = [2, 16, 26, 32, 52, 71, 80, 88]
print("A contains 32: {}".format(ordered_contains(A, 32)))
print("A contains 7: {}".format(ordered_contains(A, 7)))
print("A contains -10: {}".format(ordered_contains(A, -10)))
print("\n(Did those results match the earlier example?)")
Run Code Online (Sandbox Code Playgroud)
这是输出:
A contains 32: ([2, 16, 26, 32], 32)
A contains 7: ([2, 16, 26, 32], 7)
A contains -10: None
(Did those results match the earlier example?)
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
任何帮助将不胜感激。
谢谢
小智 5
您的代码中存在一些问题:
return (list1, numToFind)->return listSplitter(list1, numToFind)elif list2[-1] <= numToFind and list1[0] >= numToFind:-> elif list2[-1] >= numToFind and list2[0] <= numToFind:(如果这不是打字错误,那么我认为它在逻辑上是不正确的)if lenOfList% 2 == 0:和else是相同的。因此,没有必要将这两种情况分开。list1 = listToProcess[0:int(lenOfList / 2)]
list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
if list1[-1] >= numToFind and list1[0] <= numToFind:
return listSplitter(list1, numToFind)
elif list2[-1] >= numToFind and list2[0] <= numToFind:
return listSplitter(list2, numToFind)
Run Code Online (Sandbox Code Playgroud)
将错过一种情况,其中list1和list2具有 1 个元素并且它们都不同于numToFind. 这就是为什么None在某些情况下会返回的原因。要处理这种情况,只需return False在上面的代码末尾添加。这是我纠正上述问题后的代码:
def listSplitter(listToProcess, numToFind):
lenOfList = len(listToProcess)
if lenOfList == 1:
return numToFind == listToProcess[0]
list1 = listToProcess[0:int(lenOfList / 2)]
list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
if list1[-1] >= numToFind and list1[0] <= numToFind:
return listSplitter(list1, numToFind)
elif list2[-1] >= numToFind and list2[0] <= numToFind:
return listSplitter(list2, numToFind)
return False
def ordered_contains(S, x):
return listSplitter(S,x)
A = [2, 16, 26, 32, 52, 71, 80, 88]
print("A contains 32: {}".format(ordered_contains(A, 32)))
print("A contains 7: {}".format(ordered_contains(A, 7)))
print("A contains -10: {}".format(ordered_contains(A, -10)))
print("\n(Did those results match the earlier example?)")
Run Code Online (Sandbox Code Playgroud)
输出:
A contains 32: True
A contains 7: False
A contains -10: False
(Did those results match the earlier example?)
Run Code Online (Sandbox Code Playgroud)