python:递归函数

1,初识递归函数

1)什么是递归函数?
在函数中自己调用自己叫做递归函数
递归函数超过一定程度会报错。---RecursionError: maximum recursion dep th exceeded while calling a Python object。递归的错误,超过了递归函数的最大深度。
2)最大递归深度:默认997
3)递归函数的优缺点
#如果递归次数太多,就不适合使用递归来解决问题。
#递归的缺点:占内存
# 递归的优点:会让代码变简单
4)什么时候用递归?
问题分析一级一级向下,答案一步一步向上返。
2、初识算法------二分法
 
#找到目标值aim,在l中的位置
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_index = len(l)//2 #找中间的索引 if l[mid_index] < aim: #如果中间索引所对应的值<目标值 new_l = l[mid_index+1 :] find(new_l,aim) elif l[mid_index] > aim: #如果中间索引所对应的值>目标值 new_l = l[:mid_index] find(new_l, aim) else: print('找到了',mid_index,l[mid_index]) find(l,66)
#问题:如果目标值不在l里,则会报错,且没有返回值。因此需要进行改进

改进:

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end - start)//2 + start
    if start <= end:
        if l[mid_index] < aim:
            return find(l,aim,start =mid_index+1,end=end)
        elif l[mid_index] > aim:
            return find(l, aim, start=start, end=mid_index-1)
        else:
            return mid_index
    else:
        return '找不到这个值'


ret= find(l,44)
print(ret)

 3,超过最大递归限制的报错问题

只要写递归函数,必须要有结束条件

4,返回值问题

不要只看到return就认为返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。

如果不是返回给最外层函数,调用者就接收不到。

需要再分析,看如果把结果返回回来

5,大部分的递归可以用循环来替代,递归一般与算法相结合。

6,递归函数的效率问题

递归函数一次执行调用自身一次会很快,如果一次执行调用了两次自身的话就会很慢。

 改进:

 问题:返回值是一个元祖,返回的是当前值和上一个值

 

posted @ 2018-01-08 14:46  kakawith  阅读(390)  评论(0编辑  收藏  举报