递归函数

递归:就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。简单递归例子:

def story():
    s = """
    从前有个山,山里有座庙,庙里老和尚讲故事,
    讲的什么呢?
    """
    print(s)
    story()
    
story()

查看递归的最大深度为997代码如下:

n=0
def f():
    global  n
    print(n)
    n+=1
    f()
f()

可以修改递归最大深度但是不建议修改,修改代码如下:

import sys
sys.setrecursionlimit(10000000)
n=0
def f():
    global  n
    print(n)
    n+=1
    f()
f()

递归函数需要需要返回值:也就是每一个都需要return

比如你问别人的年龄:他不直接告诉你,他会说我的年龄和别人年龄的关系

def age(n):
    if n==1:
        return 40
    else:
        ret=age(n-1)
        return  ret+2
r=age(5)
print(r)
# def age(n):
#     if n==1:
#         return 40
#     else:
#         ret=age(n-1)
#         return  ret+2
# r=age(5)
# print(r)
# print(age(5))#48
#     if n==1:
#         return 40
#     else:
#         ret=age(4)#46
#         return  ret+2#48
# def age(4):
#     if n==1:
#         return 40
#     else:
#         ret=age(3)#44
#         return  ret+2#46
#
# def age(3):
#     if n==1:
#         return 40
#     else:
#         ret=age(2)#42
#         return  ret+2#44
# def age(2):
#     if n==1:
#         return 40
#     else:
#         ret=age(1)#40
#         return  ret+2#42
# def age(1):
#     if n==1:
#         return 40
#     else:
#         ret=age(0)
#         return  ret+2

这个代码是对上面递归的分解。

if和else里都有返回值,还有递归调用谁,就把返回值返回给谁。递归结束的方式是遇到return,还有函数遇到return就结束。

递归的应用:

查看数字是否在这个列表里

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim):
    mid=len(l)//2
    if l[mid]>aim:
        new_l=l[:mid]
        return  find(new_l,aim)
    elif  l[mid]<aim:
        new_l=l[mid+1:]
        return find(new_l,aim)
    else:
        return l[mid]
print(find(l,43))

一个数,直到不能被2整除为止:

def call(num):
   if num%2==0:
       num=num//2
       return call(num)
   else:
     return num
print(call(6))

通过二分法查找数字在列表里的索引:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim,start,end):
    mid=(start+end)//2
    #print(mid)
    if l[mid]>aim:
       end=mid-1
       return  find(l,aim,start,end)
    elif l[mid]< aim:
        start=mid +1
        return find(l,aim,start,end)
    else:
        return mid


print(find(l,88,start=0,end=len(l)-1))
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l, aim,start = 0,end = len(l)-1 ):
    mid = (start+end)//2
    if aim  not in l[start:end+1]:
        return
    elif aim > l[mid]:
        return func(l,aim,mid+1,end)
    elif aim < l[mid]:
        return func(l,aim,start,mid-1)
    elif aim == l[mid]:
        print("bingo")
        return mid

index = func(l,100)
print(index)

同一个问题的两个解决方法

总结:递归解决问是通过控制参数来控制每一次调用缩小计算的规模

适用场合:

数据规模在减少,但是解决问题的思路没有变

结束递归的标志:return

 

posted on 2017-07-31 17:35  黎明NB  阅读(185)  评论(0编辑  收藏  举报

导航