python之协程函数、递归、二分法

一、协程函数:

    协程函数的语法:

    def eater(name):

            print('%s说:我开动啦' %name)
food_list=[]
while True:
food=yield food_list
food_list.append(food)
print('%s 吃了 %s' %(name,food))

e=eater('egon')
e.send(None) #next(e) #初始化装饰器,
e.close() #关闭
    解决方法:第一步:初始化函数Next(),第二部:给yield传值
二、面向过程:
    面向过程:核心是过程二字,过程就是解决问题的步骤,
基于面向过程去设计程序就像是在设计,一条工业流水线,是一种机械式的思维方式    #优点:程序结构清晰,可以把复杂的问题简单化,流程化
    #缺点:可扩展性差,一条流线只是用来解决一个问题
    #应用场景:linux内核,git,httpd,shell脚本
三、递归:
  
  递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身

    递归效率低,需要在进入下一次递归时保留当前的状态
   解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自己
   但是python又没有尾递归,且对递归层级做了限制

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,              栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)



  递归的执行分为两个阶段:
  1 递推
  2 回溯
  
def age(n):

   if n == 1:
          return 18
   return age(n-1)+2
     print(age(5))


四、二分法:
    
l=[1,2,10,2,30,40,33,22,99,31]
        def search(num,l):
print(l)
if len(l) > 1:
mid=len(l)//2
if num > l[mid]:
#in the right
l=l[mid:]
search(num,l)
elif num < l[mid]:
#in the left
l=l[:mid]
search(num,l)
else:
print('find it')
else:
if num == l[0]:
print('find it')
else:
print('not exists')

search(100,l)
 
 

 

 

 
 

  
posted @ 2017-08-01 07:08  咬耗子的猫  阅读(223)  评论(0编辑  收藏  举报