算法基础-理论代码

# 循环打印“抱着抱着抱着我的小鲤鱼的我的我的我”
def test(n):
    if n == 0:
        print("我的小鲤鱼", end='')
    else:
        print("抱着", end='')
        test(n-1)
        print("的我", end='')

test(5)
#汉诺塔问题
t = 0

def hanoi(n, A, B, C):
    global t
    if n > 0:
        hanoi(n-1, A, C, B)
        t += 1
        print("%s -> %s" % (A, C))
        hanoi(n-1, B, A, C)

# hanoi(8,'A','B','C')
# print(t)
#查找
from timewrap import *                       #导入的是一个计算时间的装饰器

@cal_time        #计算时间的装饰器
def binary_search(li, val):           #二分查找法
    low = 0                           #左边从0算起
    high = len(li) - 1                #右边从列表长度-1算起
    while low <= high:                #说明至少两个元素
        mid = (low + high) // 2       #找到中间的那个值
        if li[mid] > val:             #如果中间值比要查找的那个值还大,说明你要查找的值在左边
            high = mid - 1          
        elif li[mid] < val:           #如果中间值比要查找的那个纸还小,说明你要查找的值在右边
            low = mid + 1
        else:                         #第三种可能性就是直接找到了
            return mid
    else:
        return -1                     #如果穿进去的值是一个空的列表

def find_a(nums, target):     #nums是一个列表,target是你要查找的对象,
    low = 0                    #左边从0开始算起
    high = len(nums) - 1        #右边从最大长度-1开始算起
    while low <= high:           #至少有一个值
        mid = (low + high) // 2   #中间值的索引
        if target <= nums[mid]:    #如果你要查找的值在中间值得左边
            high = mid - 1          中间值为最大值
        else:          
            low = mid + 1           #中间值为最小值
    #[1, 2, 2, 2, 4, 8, 10]

    if low < len(nums):
        return low
    else:
        return -1



def find_b(nums, target):
    low = 0
    high = len(nums) - 1
    while low <= high:
        mid = (low + high) // 2
        if target < nums[mid]:
            high = mid - 1
        else:
            low = mid + 1
    if low < len(nums):
        return low
    else:
        return -1

@cal_time
def linear_search(li, val):      #li是列表,val是你要查找的值,找得到返回索引,找不到返回-1
    try:
        return li.index(val)             #返回索引
    except ValueError:
        return -1                        #找不到

li = [1,2,2,2,4,8,10]
print(find_a(li, 10))

 

#利用二分查找法查找学生的详细信息并输出
l = [ {"id":1001, "name":"张三", "age":20}, {"id":1002, "name":"李四", "age":25}, {"id":1004, "name":"王五", "age":23}, {"id":1007, "name":"赵六", "age":33} ] def bin_search(data_set,value): low = 0 #最左边的 high = len(data_set) - 1 #最右边的 while low <= high: mid = (low+high) // 2 #中间的 if data_set[mid]["id"] == value: #如果中间这个值得id == value,就返回详细信息 return (mid,data_set[mid]) elif data_set[mid]["id"] > value: 如果这个id大于value值, high = mid -1 else: low = mid + 1 else: return (0,None) print("退出q请按Q") flag = True while flag: sid = input("请输入学生学号>>>:").strip() if sid.isdigit(): if sid.upper() == "Q": flag = False else: sid = int(sid) mid,infos = bin_search(l,sid) if not infos: print("抱歉,没有这个人") else: s = "学生学号:{id},姓名:{name},年龄:{age}".format(**infos) print("该学生的信息索引坐标是:%s"%mid) print("该学生的所有详细信息为:%s"%s)

 

posted @ 2018-02-01 15:18 前方、有光 阅读(...) 评论(...) 编辑 收藏