python基础之递归、二分法

 一 递归

1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出)

注:栈遵循先进后出,先吃后拉原则。

  递归能干得事,while True都能干。

查看和修改栈的大小:

>>> import sys
>>> sys.getrecursionlimit()
1000
>>>
>>> sys.setrecursionlimit(10000)
>>> sys.getrecursionlimit()
10000
>>>

 递归初识:

part1:

def test():
    test()
test()

输出结果:

#part2:

#:有一个明确的结束条件
def test(n):
    print(n)
    n = n -1
    if n >=1:
        test(n)
test(5)

输出结果:

#part3

def calc(n):
    print(n)
    if int(n/2)==0:
        return n
    return calc(int(n/2))
print('********',calc(10))

输出结果:

 

#part4

# 5 = 5*4*3*2*1(实现阶乘)

def func(num):
    if num==1:
        return 1
    if num>1:
        return func(num-1)*num
k = func(5)  
print(k)

输出结果:

分析过程:

"""
def func(num):
    if num==1:
        return 1
    if num>1:
        return func(num-1)*num
k = func(5)  
print(k)                   #最后k等于120

def func(5):
    if 5==1:
        return 1
    if 5>1:
        return func(4)*5   #返回时func(4) 等于 24 , func(4)*5

def func(4):
    if 4==1:
        return 1
    if 4>1:
        return func(3)*4   #返回时func(3) 等于 6 , func(3)*4 等于 24

def func(3):
    if 3==1:
        return 1
    if 3>1:
        return func(2)*3   #返回时func(2) 等于 2 , func(2)*3 等于 6

def func(2):
    if 2==1:
        return 1
    if 2>1:
        return func(1)*2   #返回时func(1) 等于 1 , func(1)*2 等于 2

def func(1): 
    if 1==1:
        return 1           #最终得出结论func(1) 等于 1,开始返回
"""

 

使用实例:

猜年龄游戏:

小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。

又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、

又问小青多大,小青说10岁了。问小黄现在多大?

 

分析:

 

age(5)=age(4)+2   n=5 age(n)=age(n-1)+2
age(4)=age(3)+2   n=4 age(n)=age(n-1)+2
age(3)=age(2)+2   n=3 age(n)=age(n-1)+2
age(2)=age(1)+2   n=2 age(n)=age(n-1)+2
age(1)=10       n=1 age(n)=10

n=1 res=10
n>1 res=age(n-1)+2

答案:

def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1)+2

print(age(5))

 

二 二分法

猜数字是否在列表内游戏:

# data=[]
# for i in range(1,100000,2):
#    data.append(i)


data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
# num=19
# i=0
# while True:
#     if num == data[i]:
#         print('find it')
#         break
#     i+=1

def search(num,data):
    print(data)
    if len(data) > 1:
        #二分
        mid_index=int(len(data)/2)
        mid_value=data[mid_index]
        if num > mid_value: #19>18
            #num在列表的右边
            data=data[mid_index:] #data[0:]-->[18]
            search(num,data)
        elif num < mid_value:
            #num在列表的左边
            data=data[:mid_index]
            search(num,data)
        else:
            print('find it')
            return
    else:
        if data[0] == num:
            print('find it')
        else:
            print('not exists')

# search(9527,data)
search(15,data)
# search(1,data)

 

posted @ 2017-04-14 14:11  luchuangao  阅读(719)  评论(0编辑  收藏  举报