美文网首页
13_Python递归函数_全栈开发学习笔记

13_Python递归函数_全栈开发学习笔记

作者: 豆行僧 | 来源:发表于2019-01-24 09:48 被阅读0次

1. 初识递归

什么是递归:在函数中调用自身函数
最大递归深度默认是997/998 —— 是python从内存角度出发做得限制

递归演示范例:

def story():
    print("从前有座山")
    story()
story()

1.1 递归报错信息

RecursionError: maximum recursion depth exceeded while calling a Python object
上句是递归的错误,超过了递归的最大深度

1.2 破除默认深度997

但能跑多少次,看每台电脑的内存大小。

import sys
sys.setrecursionlimit(1000000)

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

1.3 递归结论

如果递归次数太多,就不适合使用递归来解决问题
递归的缺点 : 占内存
递归的优点: 会让代码变简单

1.4 递归例子

题目:

alex 多大       n = 1   age(1) = age(2)+2 = age(n+1) + 2
alex比egon大两岁
egon多大?      n = 2   age(2) = age(3) + 2 = age(n+1) +2
egon比wusir大两岁
wusir多大       n = 3   age(3) = age(4) + 2 = age(n+1) +2
wusir比金老板大两岁
金老板多大?
金老板40了      n = 4   age(4) = 40

n = 4 age(4) = 40
n <4  age(n) = age(n+1) +2

范例:
计算年龄

def age(n):
    if n == 4:
        return 40
    elif n >0 and n < 4:
        return age(n+1) + 2

print(age(1))

执行结果:

46

如何看递归:

# def age(1):
#     if 1 == 4:
#         return 40
#     elif 1 > 0 and 1 < 4:
#         return 46
#
# def age(2):
#     if 2 == 4:
#         return 40
#     elif 2 >0 and 2 < 4:
#         age(3) + 2    None +2
#
# def age(3):
#     if 3 == 4:
#         return 40
#     elif 3 >0 and 3 < 4:
#         42
#
# def age(4):
#     if 4 == 4:
#         return 40
#     elif n >0 and n < 4:
#         age(n+1) + 2

2. 初识算法

什么叫算法
计算的方法 : 人脑复杂 计算机简单

99 * 13 = 1287 = 13*100 - 13
查找 : 找数据
排序 :
最短路径

我们学习的算法 都是过去时
了解基础的算法 才能创造出更好的算法
不是所有的事情都能套用现成的方法解决的
有些时候会用到学过的算法知识来解决新的问题

二分查找算法 必须处理有序的列表
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]

范例1.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 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)

执行结果:

找到了 0 66

范例1.2:
代码完善

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 = 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,aim
    else:
        return '找不到这个值'


ret= find(l,44)    # 找不到
print(ret)
ret= find(l,66)    # 发生好几次
print(ret)
ret= find(l,67)    # 发生两次调用
print(ret)

执行结果:

找不到这个值
(17, 66)
(18, 67)

3. 总结

超过最大递归限制的报错
只要写递归函数,必须要有结束条件。

返回值
不要只看到return就认为已经返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。
如果不是返回给最外层函数,调用者就接收不到。
需要再分析,看如何把结果返回回来。

相关文章

  • 13_Python递归函数_全栈开发学习笔记

    1. 初识递归 什么是递归:在函数中调用自身函数最大递归深度默认是997/998 —— 是python从内存角度出...

  • python学习4

    学廖雪峰老师的python教程笔记。 1、递归函数 函数内部调用该函数本身,比循环逻辑简单 注意防止栈溢出 尾递归...

  • Clojure 学习笔记 :10 美妙的递归

    Clojure 零基础 学习笔记 递归 尾递归 Clojure 学习笔记 :10 美妙的递归 递归,或者说函数的递...

  • 仅用递归函数和栈操作逆序一个栈

    递归函数一:将栈stack的栈底元素返回并移除 递归函数二:逆序一个栈

  • Python ☞ day 6

    Python学习笔记之 os模块 & 递归函数 & 栈 & 队列 os模块:包含了普遍的操作系统的功能 有些方法存...

  • 第三章:递归

    递归 盒子里面找钥匙 基线条件和递归条件 栈 调用栈 调用另一个函数时,当前函数暂停并处于未完成的状态 递归调用栈...

  • 算法图解系列之递归[03]

    3 递归 3.1 递归<函数> 3.2 基线条件和递归条件 3.3 递归调用栈

  • 1

    #函数 ##递归函数容易,栈溢出,这个时候可以用*尾递归*优化,尾递归的意思就是说在递归函数末尾引用本函数的时候,...

  • 算法图解 (三)

    递归 基线条件指的是函数不再调用自己, 相当于一个出口; 递归条件指的是函数自己调用自己 栈 栈又称为栈或堆叠, ...

  • 全栈之巅—全栈开发系列课程nodejs、js、vue、小程序开发

    微信扫码进入全栈之巅小程序,免费学习全栈开发技术。

网友评论

      本文标题:13_Python递归函数_全栈开发学习笔记

      本文链接:https://www.haomeiwen.com/subject/zlxyjqtx.html