各位大神好,本菜鸟初学python,请问如何用递归来实现二分法算法呢?我自己编了个,但是不明白哪里错了

deferfenfa(l,num):low=0high=len(l)-1mid=int(len(l)/2)iflen(l)>1:ifnum>l[mid]:l1=l[mid... def erfenfa(l,num):
low=0
high=len(l)-1
mid=int(len(l)/2)
if len(l)>1:

if num>l[mid]:
l1=l[mid:]
erfenfa(l1,num)

elif num<l[mid]:
l2=l[:mid]
erfenfa(l2,num)

elif num==l[mid]:
print('exist',mid)

else: print('not exist')

return None

l=[1,2,3,10,20,30,50,60,100]
erfenfa(l,20)
展开
 我来答
紫薇参星
科技发烧友

2019-03-07 · 有一些普通的科技小锦囊
知道大有可为答主
回答量:5983
采纳率:92%
帮助的人:3625万
展开全部

因为你改变了列表l的大小,所以它输出的不是在原列表l的序号,而是在子列表的序号

因此不改变列表l,而只需要改变搜索范围,就能找到数的正确位置了.

完整的程序如下(改动的地方见注释)

def erfenfa(l,num,low,high): #这里增加两个参数

 #low=0 #这里去掉这句

 #high=len(l)-1 #这里去掉这句

 mid=int((low+high)/2)#这里把len(l)/2改成(low+high)/2

 if low<mid: #这里把len(l)>1改成low<mid

  if num>l[mid]:

   #l1=l[mid:] #这里去掉这句

   erfenfa(l,num,mid,high) #这里增加两个参数

  elif num<l[mid]:

   #l2=l[:mid] #这里去掉这句

   erfenfa(l,num,low,mid) #这里增加两个参数

  elif num==l[mid]:

   print('exist',mid)

 else:

   print('not exist')

 #return None #这里去掉这句

l=[1,2,3,10,20,30,50,60,100]

erfenfa(l,50,0,len(l)-1)

源代码(注意源代码的缩进)

华玉龙55
2019-03-06 · TA获得超过341个赞
知道小有建树答主
回答量:694
采纳率:79%
帮助的人:88.9万
展开全部

按照你的代码,可以正常运行啊,估计你是缩进的问题,我把缩进好的拍给你

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dagewxw
2019-05-05 · TA获得超过5929个赞
知道大有可为答主
回答量:3523
采纳率:67%
帮助的人:986万
展开全部
def binSearch(numList, left, right, num):
if left > right:
return -1
mid = (left + right) / 2
if num == numList[mid]:
return mid
elif num < numList[mid]:
return binSearch(numList, left, mid-1, num)
else:
return binSearch(numList, mid+1, right, num)

nums = [1,2,3,10,20,30,50,60,100]
print(binSearch(nums, 0, len(nums)-1, 20))
print(binSearch(nums, 0, len(nums)-1, 50))
print(binSearch(nums, 0, len(nums)-1, 60))
print(binSearch(nums, 0, len(nums)-1, 2))
print(binSearch(nums, 0, len(nums)-1, -20))
print(binSearch(nums, 0, len(nums)-1, 120))
print(binSearch(nums, 0, len(nums)-1, 25))
4
6
7
1
-1
-1
-1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式