一. 递归函数

  如果一个函数在内部调用自身本身,这个函数就是递归函数。

 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改
def func(n):
print(n)
func(n+1)
func(1)

查看最大递归深度

‘’‘
改变最大递归深度,根据自身电脑配置,深度各不相同
’‘’
import sys
sys.setrecursionlimit(1000000)

修改最大递归深度

举个例子:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。

那你问金鑫,金鑫告诉你,他40了。。。

这个时候你是不是就知道了?alex多大?

age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40

分析

def age(n):
if n == 4:
return 40
elif n > 0 and n < 4:
return age(n+1) + 2
print(age(1))
def age(1):
if 1 == 4:
return 40
elif 1 > 0 and 1 < 4:
return age(1+1) + 2 返回给age(1) def age(2):
if 2 == 4:
return 40
elif 2 > 0 and 2 < 4:
return age(2+1) + 2 返回给上一个的age(1+1) def age(3):
if 3 == 4:
return 40
elif 3 > 0 and 3 < 4:
return age(3+1) + 2 返回给上一个的age(2+1) def age(4):
if 4 == 4:
return 40
elif 4 > 0 and 4 < 4:
return age(4+1) + 2 返回给上一个的age(3+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)

基础版

def find(l,aim,start = 0,end = len(l)):
mid_index = (end - start) // 2 + start # 计算中间值
if l[mid_index] < aim:
find(l,aim,start = mid_index + 1,end = end)
elif l[mid_index] > aim:
find(l, aim, start=start, end= mid_index - 1)
else:
print('找到了',mid_index,l[mid_index])
find(l,66) # 找到了 17 66

升级版

有问题:
  1. 参数 end
  2. 返回值
  3. 找不到怎么办?
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 '找不到这个值'

完整版

												

python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法的更多相关文章

  1. python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象

    一. 面向对象的引入# 人狗大战 def person(name,HP,aggr,sex): person = { 'name':name, # 昵称 'HP':HP, # 生命值 'aggr':ag ...

  2. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  3. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  4. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  5. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  6. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  7. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  8. python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...

  9. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

随机推荐

  1. 第三天,爬取伯乐在线文章代码,编写items.py,保存数据到本地json文件中

        一. 爬取http://blog.jobbole.com/all-posts/中的所有文章     1. 编写jobbole.py简单代码 import scrapy from scrapy. ...

  2. Linux之du命令的使用

    du的用法 du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh du常用的选项: -h:以人类可读的方式显示 -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘 ...

  3. appium Capabilities的各个标签

    今天详解一下Capabilities的各个标签,以后如果用得着可以随时翻阅. General Capabilities 标签 概述 值 automationName 使用引擎 默认为Appium,其中 ...

  4. Java NIO学习与记录(一):初识NIO

    初识 工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO. 一.NIO是什么? 非阻塞式I ...

  5. 一段关于Unix、Linux和Windows的暗黑史

    "SCO在言语上变得越来越好斗,而且还拒绝展示有关诉讼的任何证据,一切都似乎在表明,SCO只不过是在那里拉虎皮做大旗地狂言乱语.但是,微软 决不会轻易放弃这么可以一个利用这些狂言乱语的好机会 ...

  6. Javascript显示和隐式类型转换

    1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所 ...

  7. Spring多线程编程

    在Spring框架下如何保证线程安全,如何很happy顺畅地并发编程. 常见的如下面的这坨代码,在Spring中,默认是单例的,也就是说,在同一时刻只有一个SpringOrdinaryClass的单实 ...

  8. JAVA的静态代理与动态代理比较--转载

    扩展:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/JAVA的静态代理与动态代理比较 一.概念 代理模式是常用的Java 设计模式,它的特 ...

  9. MTCNN 实现人脸识别

    MTCNN(Multi-task CNN) MTCNN难点 WIDER FACE等数据集为我们提供的图片并不是MTCNN支持的训练样本, 需要通过几个脚本将其转为MTCNN可以接受的数据集, 这些脚本 ...

  10. [Mysql]——备份、还原、表的导入导出

    备份 1. mysqldump mysqldump备份生成的是个文本文件,可以打开了解查看. Methods-1 备份单个数据库或其中的几个表# mysqldump -u username -p'pa ...