python 之 递归
终于来到了这里,这是一座山,山那边都是神仙
定义:在一个函数里调用函数本身
最好的例子就是,求阶乘
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 之 递归的更多相关文章
- 关于python最大递归深度 - 998
今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...
- Python的递归
递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...
- Python的递归深度
RuntimeError: maximum recursion depth exceeded while calling a Python object 大意是调用 Python 对象时超出最大深度限 ...
- Python的递归深度问题
Python的递归深度问题 1.Python默认的递归深度是有限制的,当递归深度超过默认值的时候,就会引发RuntimeError.理论在997. 2.解决方法:最大递归层次的重新调整,解决方式是手工 ...
- Python中递归的最大次数
实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- python函数递归和生成器
一.什么是递归 如果函数包含了对其自身的调用,该函数就是递归的.递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的 ...
- python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
- python 解决递归调用栈溢出
递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...
- 测试python最大递归层次
转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...
随机推荐
- 利用cordova打包H5混合app
1.首先布置jdk环境,下载jdk(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- JavaWeb学习(三十)———— 数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- 2017ACM/ICPC亚洲区沈阳站(部分解题报告)
HDU 6225 Little Boxes 题意 计算四个整数的和 解题思路 使用Java大整数 import java.math.BigInteger; import java.util.Scann ...
- rootkit(kbeast-v1)
Rootkit有应用级.内核级和硬件级 用的比较多的是内核级别,比如基于linux LKM编写的rootkit rootkit可以理解为一个超级管理员的工具箱,这个工具箱通过调用系统LKM接口可以动态 ...
- override与new的区别
using System; namespace ConsoleAppDemo { class BaseClass { public void Fun() { Console.WriteLine(&qu ...
- c# Unicode 转换 ASCII
/// <summary> /// Unicode 转换 ASCII /// </summary> /// <param name="theText" ...
- 微信服务器配置令牌(Token)
实现步骤: 第一步:填写服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL).Token和EncodingAESKey,其中UR ...
- EditPlus配置
1.设置语法和字符 2.调用浏览器 3.设置字符编码
- 用CSS控制DIV居中失效的解决方法
1.一般情况下DIV居中失效是因为没写DTD语句 在页面的最上方加上: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...
- python之 协程
协程: 协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 1.Greenlet import time # import greenlet from greenlet import g ...