二分法分析:
目的:在一个有序的列表nums,判断x是否在这个列表里
一、问题分析(研究需要解决的问题)
1.怎么样最快的判断出x是否在列表里
二、程序规格说明说:确定程序做什么
1.利用中间值比较x,逐步比较,缩小空间
2.x代表要判断的值,nuns代表列表
3.low象限代表最低值,high象限代表最高值
三、设计:用伪代码编写算法(写成方法)
1、创建search方法,可输入x,nums
2、创建区域最低值low=0,创建区域高值high
3、创建条件循环,当low小于high时,进入循环
4、利用low+high//2获取中间值
5、判断x与中间值(nums[mid])是否相等,相等则返回min,中间值大于x,low则取min+1,中间值小于x,high则取中间值,再进入循环判断
6、如果low取到最大值且等于x时返回x(可能x取的值就是最大的值,循环不会判断到)
7、如果都没有,则返回-1表示列表里没有x
四、将设计语言翻译成编译语言
1.def search(x,nums):
2.low=0,high=len(nums)-1
3.while low<high:
4.mid=(low+high)//2
5.if x ==nums(mid): return mid; elif x>mid: low=low+1; else: high=mid
6.if nums(low)==x: return low
7.return -1
(递归思想)反转字符串:
目的:反转输入的字符串
一、问题分析
1.利用切片的方法分割字符串
2.利用递归不断切字符串
3.注意死循环
二、规格说明说
s:字符串
reverse:方法名称
三、设计伪代码
1.创建方法
2.判断字符串是否为空,如为空返回字符串
3.递归切字符串并返回
四、编程语言翻译代码
def reverse(s):
if s=="":
return s
else:
return reverse(s[1:])+s[0]
(递归思想)二分法:
目的:利用递归思想简化二分法算法
规格说明说:
1.二分法算法 :利用中间值与查找数比较,并逐渐缩小范围,判断数是否存在
2.递归:找出中间值mid对比x,相等返回mid, 如果小于以中间值为点向下切片min_nums=nums[0:mid],大于max_nums=nums[mid+1:high]
3.当low+high//2==0和nums[low+high]==x时,返回1,否则返回-1
伪代码:
创建函数search,可输入值x,nums
得到最低数值low,得到最高数值high,算出中间数值mid,
找出中间值mid对比x,相等返回mid, 如果小于以中间值为点向下切片min_nums=nums[0:mid],大于max_nums=nums[mid:high]
"""利用递归思想,简化二分法"""
def Seach(x,nums):
low=0
high=len(nums)-1
mid = (low + high) // 2
if mid ==0:
return -1
item=nums[mid]
if x==item:
return 1
elif x<item:
num=nums[0:mid]
return Seach(x,num)
elif x>item:
num=nums[mid+1:high]
return Seach(x,num)
证明这个想法时错误的
正确的如下:
def recBinSearch(x, nums, low, high):
if low > high: return -1
mid = (low + high) // 2 item = nums[mid]
if item == x:
return mid elif x < item:
# No place left to look, return -1
# Found it! Return the index
# Look in lower half return recBinSearch(x, nums, low, mid-1)
else: # Look in upper half return recBinSearch(x, nums, mid+1, high)