# -*- coding: utf-8 -*-
"""
在一万个有序数列中找到目标值并打印其索引
目前测试的是在一万个有序数列中,每个值的范围在两万以内。当然,数列的长度(这里是一万)以及值的范围(这里的两万)都可以自定义。
重点知识:
二分法
递归函数
"""
import random
def create_data(list_size, range_num):
"""
随机生成一个列表,指定了列表长度以及每个值所在的范围
:param list_size: 列表长度
:param range_num: 每个在列表中的值的大小范围
:return: 生成的列表
"""
temp_set = set()
while len(temp_set) < list_size:
i = random.randrange(range_num)
if i not in temp_set:
temp_set.add(i)
data_set = list(temp_set)
data_set.sort()
return data_set
def search_goal(data, find_num):
"""
在列表中查找目标值
:param data: 传入的列表
:param find_num: 查找的目标值
:return: 返回布尔值,在列表中是否查找到了
"""
if len(data) > 1:
mid_index = int(len(data) / 2)
if data[mid_index] == find_num:
# print("目标数字[{0}]已找到!".format(find_num))
return True
elif data[mid_index] > find_num:
return search_goal(data[:mid_index], find_num)
else:
return search_goal(data[mid_index:], find_num)
else:
if data[0] == find_num:
# print("目标数字[{0}]已找到!".format(find_num))
return True
else:
print("\033[1;31m 目标数字[{0}]在列表中不存在!\033[0m".format(find_num))
if __name__ == '__main__':
while True:
goal_num = input("在一万个有序数列(该序列数字范围在两万以内)中查找数字;请输入需要查找的数字:")
if goal_num.isdigit():
goal_num = int(goal_num)
data_created = create_data(10000, 20000)
res = search_goal(data_created, goal_num)
if res:
print("\033[1;32m 目标数字[{0}]已找到,其在列表中的索引为{1}\033[0m".format(goal_num, data_created.index(goal_num)))
else:
print("\033[1;31m 目标值输入无效,请重新输入。\033[0m")