鱼C论坛

 找回密码
 立即注册
查看: 799|回复: 7

纠错和改进:二分查找法的Python实现

[复制链接]
发表于 2018-10-9 22:43:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 树皮 于 2018-10-9 22:47 编辑

课程的作业,要求广播自己的程序,进行纠错和改进。Python小白写的代码,麻烦大家看看有什么错误的地方或是需要改进的地方。要求允许用户由键盘输入数组,目标值和数组长度。
考虑各种特殊输入的话,应该存在很多问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-10-9 22:43:50 | 显示全部楼层
def binary_search(A,target,num):
    num=len(A)
    low=0
    height=num
    while low<=height:
        mid=(low+height)//2
        if A[mid]<target:
            low=mid+1
        elif A[mid]>target:
            height=mid-1
        else:
            return  print('%s在数组中的第%s位'%(target,mid+1))
    return print("-1")

if __name__== "__main__":
    str_in=input('请以空格号为间隔输入数组:')
    A=[int(n)for n in str_in.split()]
    str_in=input('请输入一个目标值:')
    target=int(str_in)
    str_in=input('请输入数组长度:')
    num=int(str_in)
    A.sort()
    result=binary_search(A,target,len(A))
    print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 23:31:08 | 显示全部楼层
基本是没啥问题,有几个小建议哈
1.既然你num在函数里定义了,就没必要作为参数传进来了
2.def 里面定义了打印结果就不要再返回放在main中打印了,你要么全放在函数中打印,要么用函数返回值在main中打印,不然不利于函数的使用。
3.height是高度的意思这里一般用low 和 high
4.你可以考虑下如果所查找的数组中有重复元素该怎么办
def binary_search(A,target):
    num=len(A)
    low=0
    high=num
    while low<=high:
        mid=(low+high)//2
        if A[mid]<target:
            low=mid+1
        elif A[mid]>target:
            high=mid-1
        else:
            return  print('%s在数组中的第%s位'%(target,mid+1))
    print("搜索的数不存在!")

if __name__== "__main__":
    str_in=input('请以空格号为间隔输入数组:')
    A=[int(n)for n in str_in.split()]
    str_in=input('请输入一个目标值:')
    target=int(str_in)
    A.sort()
    result=binary_search(A,target)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-10-10 08:55:53 | 显示全部楼层
1005204767 发表于 2018-10-9 23:31
基本是没啥问题,有几个小建议哈
1.既然你num在函数里定义了,就没必要作为参数传进来了
2.def 里面定义 ...

十分感谢,建议很好,学到了。不过课程作业要求数组长度num是允许用户输入的数据,在binarysearch函数中需要包含(数组,关键值,数组长度),这种情况您看看有什么建议,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-10 08:56:59 | 显示全部楼层
1005204767 发表于 2018-10-9 23:31
基本是没啥问题,有几个小建议哈
1.既然你num在函数里定义了,就没必要作为参数传进来了
2.def 里面定义 ...

十分感谢,建议很好,学到了。不过课程作业要求数组长度num是允许用户输入的数据,在binarysearch函数中需要包含(数组,关键值,数组长度),这种情况您看看有什么建议,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 12:15:05 | 显示全部楼层
树皮 发表于 2018-10-10 08:56
十分感谢,建议很好,学到了。不过课程作业要求数组长度num是允许用户输入的数据,在binarysear ...

既然这样那就不用num = len(A),直接用传进来的num好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:18:58 | 显示全部楼层
A=[int(n)for n in str_in.split()]
这个写法很好哈,我也学到了,我以前都是
A = input().split( ' ')
然后再用一个for循环对每个元素强制转换类型,一直感觉很麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-10 23:40:07 | 显示全部楼层
1005204767 发表于 2018-10-10 16:18
A=
这个写法很好哈,我也学到了,我以前都是
A = input().split( ' ')

hahahah
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表