各位大神好,本菜鸟初学python,请问如何用递归来实现二分法算法呢?我自己编了个,但是不明白哪里错了 急求大神!要求为二分法查找的非递归算法设计主函数,完善算法并...

\u6c42x\u7684n\u6b21\u65b9\u4e8c\u5206\u6cd5\u7528\u8fed\u4ee3\u7b97\u6cd5\u600e\u4e48\u5199\u7a0b\u5e8f\uff1f\u4e0d\u7528\u9012\u5f52\u51fd\u6570

int Do(int n)
{
int num = n%2;
int i;
switch(num)
{
case 1:
for(i = 0;i < (n-1)/2; i++)
{
x *= x;
} //x\u7684\uff08n-1)/2\u6b21\u65b9
x *= x; //x\u7684\u5e73\u65b9
x *= x; //\u518d\u4e58\u4ee5x
break;
case 0:
for(i = 0;i < n/2; i++)
{
x *= x;
} //x\u7684n/2\u6b21\u65b9
x *= x; //x\u7684\u5e73\u65b9
break;
}
return x;
}

\u6392\u5e8f\u5f88\u7b80\u5355\u7684\u2026\u2026\u7528qsort()\u597d\u4e86
void qsort(void* Start, int element, int length, int (*cmp)(const void*,const void*));
\u4f7f\u7528\u65f6\uff0cStart\u4e3a\u8d77\u59cb\u4f4d\u7f6e\uff0celement\u662f\u5143\u7d20\u4e2a\u6570\uff0csize\u662f\u5143\u7d20\u957f\u5ea6(sizeof()\u5373\u53ef)\uff0c
\u6700\u5173\u952e\u7684\u662f\u6700\u540e\u4e00\u4e2a\u6bd4\u8f83\u51fd\u6570\uff0c\u8fd9\u4e2a\u9700\u8981\u4f60\u81ea\u5df1\u52a8\u624b\u5199

\u8fd4\u56de\u503cint\uff0c\u4f20\u53c2\u7c7b\u578b const void*\u6307\u9488
\u4f8b\u5982\uff0c\u7ed9\u6574\u6570\u6392\u5e8f\uff1a

int cmp (const void* a, const void* b){
return *((int*)a) < *((int*)b); //\u6307\u9488\u7684\u5f3a\u5236\u7c7b\u578b\u8f6c\u6362
}

\u53c8\u5982\uff1a\u6309Student\u7ed3\u6784\u4f53\u4e2d\u7684age\u4ece\u5927\u5230\u5c0f\u6392\u5e8f
int cmp(const void*Stu1,const void*Stu2){
Student * a1 = ( Student* )Stu1;
Student * a2 = ( Student* )Stu2;

return a1->age > a2->age;
}

因为你改变了列表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)

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



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



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


扩展阅读:java入门网站 ... python全栈工程师自学 ... 菜鸟编程官网html ... python和c++学哪个好 ... 少儿python编程自学 ... 菜鸟学编程网站 ... python编程入门自学 ... python代码大全 ... 花瓶大神全文免费阅读 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网