终于来到了这里,这是一座山,山那边都是神仙

定义:在一个函数里调用函数本身

最好的例子就是,求阶乘

def factorial(n):
if n == 1:
return 1
elif n > 1:
return n*factorial(n-1) while True:
n = input('n>>')
n = int(n)
print(factorial(n))

递归最大层数

上面金典的例子运行的很成功

下面再来一个,是一个古老的故事,说,从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢?

我们用代码开实现一下

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

你运行了吗?

shit,他报错了,但是这个故事讲的很完美。

RecursionError: maximum recursion depth exceeded while calling a Python object
这个错误是说,这个程序运行的代码,超过了最大递归层数。

正如我们看到的,如果没有外界阻力,它会一直运行下去

# 添加参数,设置停止条件
def calc(n, count):
print(n, count)
if count < 5:
return calc(n/2, count+1)
else:
return n
print(calc(188,0))

因为每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,直到内存被占满,然后死机。

所以限制了他的最大递归层数,一般就是999层,

当然这个数字是可以修改的,修改方法很冷门,一般也不会有人去修改它,

因为如果递归了999层都没有解决问题,那么,你该想想是不是代码写的太烂了,呵呵……..

递归的特性

1、递归必须要有一个结束条件,否则就是一个死循环,直到报错
2、每次进入更深一次递归时,递归的规模会比上次递归有所减小
3、递归的执行效率不高,递归层次过多会导致栈溢出

递归的作用

用于很多计算:斐波拉契数列,汉罗塔,多级评论树,二分查找,阶乘

二分查找例子

data_set = [1,3,4,6,7,8,9,10,11,13,14,16,18,19,21]
# data_set = list(range(101)) def b_search(n, low, high, d):
mid = int((low + high) / 2) # 中间值
print(mid)
if low == high: # 第一位 和 最后一个 对比(索引的对比)
print('not find')
return
if d[mid] > n:
print('go left', low, high, d[mid])
b_search(n, low, mid, d)
if d[mid] < n:
print('go right', low, high, d[mid])
b_search(n, mid, high, d)
else:
print('find it', d[mid]) b_search(16, 0, len(data_set), data_set)

尾递归

尾递归是对递归的优化,提高递归的效率,但是在python中并不支持,然并卵

优化:

在调用下次递归时,直接return自己,不保留外层函数的在内存中的数据,递归需要的只是这一层的信息,所以节省了内存,提高了效率

然而在python中,因为没有优化,我们鼓励使用迭代器来改写尾递归

(引用自知乎)

python 之 递归的更多相关文章

  1. 关于python最大递归深度 - 998

    今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...

  2. Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  3. Python的递归深度

    RuntimeError: maximum recursion depth exceeded while calling a Python object 大意是调用 Python 对象时超出最大深度限 ...

  4. Python的递归深度问题

    Python的递归深度问题 1.Python默认的递归深度是有限制的,当递归深度超过默认值的时候,就会引发RuntimeError.理论在997. 2.解决方法:最大递归层次的重新调整,解决方式是手工 ...

  5. Python中递归的最大次数

    实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...

  6. python非递归全排列

    刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...

  7. python函数递归和生成器

    一.什么是递归 如果函数包含了对其自身的调用,该函数就是递归的.递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的 ...

  8. python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

    1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...

  9. python 解决递归调用栈溢出

    递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...

  10. 测试python最大递归层次

    转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...

随机推荐

  1. 团队作业4——beta阶段冲刺

    Deadline: 2018-12-16 22:00PM,以博客提交至班级博客时间为准 提交: (a) 项目课堂演示: (b) 1篇冲刺准备+5篇冲刺随笔,: (c) 1篇用户使用用报告: (d) 1 ...

  2. JavaWeb学习 (十)————Cookie

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  3. Spring JDBCTemplate连接SQL Server之初体验

    前言 在没有任何框架的帮助下我们操作数据库都是用jdbc,耗时耗力,那么有了Spring,我们则不用重复造轮子了,先来试试Spring JDBC增删改查,其中关键就是构造JdbcTemplate类. ...

  4. [转]git操作指南

    [GIT上手篇]-1-基本操作(初始化仓库,添加.提交文件) 创建(初始化)一个GIT库 init 命令 说明:用于仓库的初始化 参数:--bare 创建一个纯仓库(不含缓存区和工作目录,服务器一般采 ...

  5. python取余

    a=-7,b=3, a % b = 2  #取余 a-((a/b)*b) a / b= -3 #整除 int(math.floor(-7/3.0))

  6. datatable删除行之datatable.Rows[i].Delete()。标记之后行没有了

    使用Delete()之后行消失了 先在for循环外加上dt.AcceptChanges(); 删除时在dt.AcceptChanges();

  7. Oracle入门《Oracle介绍》第一章1-4 Oracle 用户管理

    1.Oracle 默认用户 只有用合法的用户帐号才能访问Oracle数据库 Oracle 有几个默认的数据库用户 数据库中所有数据字典表和视图都存储在 SYS 模式中.SYS用户主要用来维护系统信息和 ...

  8. MVC中子页面如何引用模板页中的jquery脚本

    MVC中子页面如何引用模板页中的jquery脚本 最近在学习mvc,遇到了一个问题:在html页面中写js代码,都是引用mvc5自带的jquery脚本,虽然一拖(将指定的jquery脚本如 jquer ...

  9. 使用Sandcastle工具为.NET项目工程生成一份项目帮助文档chm

    Sandcastle的,由Microsoft创建的,是从创建MSDN风格的文档中使用的工具.NET程序集和关联的XML注释文件.目前的版本是2010年6月发布.这是命令行并没有GUI前端,项目管理功能 ...

  10. Node Redis 入门

    基础准备:Node.Js .npm或cnpm.redis安装 1.建立一个项目文件夹,这里命名 wxfc ,打开命令行输入 npm install redis . 因为没有创建package.json ...