1 2 3

递归


递归

特点:
递归算法是一种直接或者间接的调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的

递归算法的特点:
1.递归就是在过程或者函数里调用自身
2.在使用递归策略时,必须由一个明确的递归结束条件,称为递归出口
3.递归算法解题通常显得简洁,单递归算法解题的运行效率低,所以一般不提倡用递归算法设计程序
4.在递归调用的过程当中系统为每一层的返回点、局部变量等开辟了栈来存储。递归次数过多容易造成栈溢出等
5.递归函数在递归解题完成后,函数内部还会逐层回退至退出



'''
要求:
递归算法所体现的"重复"一般有三个要求
1.每次调用在规模上都有缩小(通常是减半)
2.相邻两次重复直接有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
3.在问题的规模极小时必须用直接给出解答,而不进行在递归调用,因而每次递归调用的是有条件的(以规模未达到直接解答的大小为条件),
无条件递归调用会成为死循环,而不能正常结束
'''


#例子:
def calc(n):
    print(n)
    if n/2 >1:  #递归函数的出口
       return calc(n/2) #函数返回值为自己,传参为(当前参数除以2)

ret = calc(10)  #调用calc函数并传入参数
print(ret)      #查看返回值



#递归实现斐波那契数列
def func(num1,num2,stop):
    if num1 == 0:               #限定从0开始
        print(num1,num2)
    num3 = num1 + num2          #第一个数加上第二个数
    print(num3)
    if num3<stop:               #stop限定最大值
        func(num2,num3,stop)    #递归自己,传入参数func(num2,num2+num3,stop)

func(0,1,2000)





#二分查找
'''
利用二分查找,找出一个列表中的某个数字

说明:
一般查询列表中某一位数字,可用循环遍历的方式从头到尾查找一遍,但如果数据量非常大这样是非常耗时的

二分查找法:
1.把列表的长度除以2取一个中间值,判断中间是大于或者小于需要查找的数字
2.如果中间值大于需要查询的数字则继续用此方法往左边查找
3.如果中间值小于需要查询的数字则继续用此方法往右边查找
4.递归此方法,直到查询出结果
'''
def binary_search(data_source,find_n):
    mid = int(len(data_source) / 2)                             #获取列表长度的中间位置
    if len(data_source) >=1:                                    #列表长度小于1表示没有内容了
        if data_source[mid] > find_n:                           #中间值>查询值,继续往左边找
            print("data in left of [%s]"%data_source[mid])
            binary_search(data_source[:mid],find_n)             #往左切片在递归
        elif data_source[mid] < find_n:                         #中间值<查询值,继续往右边找
            print("data in right of [%s]"%data_source[mid])
            binary_search(data_source[mid:],find_n)             #往右切片结果在递归
        else:
            print("found find [%s]"%data_source[mid])
    else:
        print("cannot find ...")

data = list(range(1,600))

binary_search(data,70)

 



posted @ 2017-05-19 09:57  矜持小蝌蚪  阅读(223)  评论(0编辑  收藏  举报
levels of contents