一. 递归函数

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

 最大递归深度默认是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. 爬虫4:re库

        一. 常见匹配模式   模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字, ...

  2. 不信任的 .exe 怎么办,用 Windows 沙盒啊!

    简评:维基百科,在计算机安全领域,沙盒(sandbox)是种安全机制,为执行中的程式提供的隔离环境.通常是作为一些来源不可信.具破坏力或无法判定程序意图的程序提供实验之用. 微软正在尝试解决人们对运行 ...

  3. POJ 2192

    #include <iostream> #include <string> #define MAXN 500 using namespace std; bool dp[MAXN ...

  4. 1. C++11保证稳定性与兼容性

    1.1 __func__预定义标识符 在c99中,__func__基本功能是返回所在函数的名字,c++11中允许使用在类或结构体中. #include <iostream> using n ...

  5. jenkins+appium android app自动化测试

    jenkins安装 pytest+jenkins安装+allure报告 新建任务 其他默认,保存 立即构建 test_login.py from src.pages import login_page ...

  6. Mac下运行git报错"xcrun: error: invalid active developer path .."

    错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...

  7. 第2章—装配Bean—自动化装配Bean

    自动化装配Bean 2.1.Spring配置可选方案 ​ 装配是依赖注入DI的本质,Spring提供了以下三种注入的装配机制: 在XMl中进行显式配置 在java中进行显式配置 隐式的Bean发现机制 ...

  8. css中字体单位px,pt,em,百分比之间的区别和用法

    px 即像素,一般国内网站使用较多,默认大小是16px; pt 印刷行业常用单位 em  相对单位,相对父元素属性的单位 ,一般用于移动端布局 rem  结合相对定位和绝对定位的优势,相对根元素htm ...

  9. Hadoop Hive概念学习系列之hive三种方式区别和搭建、HiveServer2环境搭建、HWI环境搭建和beeline环境搭建(五)

     说在前面的话 以下三种情况,最好是在3台集群里做,比如,master.slave1.slave2的master和slave1都安装了hive,将master作为服务端,将slave1作为服务端. 以 ...

  10. Linux下设置Tomcat开机启动

    1.进入/etc/rc.d/init.d,新建文件tomcat,并让它成为可执行文件 chmod 755 tomcat. #!/bin/bash # # /etc/rc.d/init.d/tomcat ...