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 ...
随机推荐
- python的Web框架,Django模型系统二,模型属性,及数据库进阶查询
原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...
- Java技术开发中的坑
1.(2014/05/28)struts2中使用eclipse自动获取getter和setter方法的坑 今天着实被eclipse坑了一把,平时遇到get和set方法时,我都是通过eclipse自动生 ...
- [POI2004] SZN
Description 给定\(N(N\leq 10000)\)个点的树,要求用最少的路径覆盖树边.路径之间可以有交点,不能有交边.问最少需要几条路径以及在第一问的基础上最长的路径最短是多少? Sol ...
- easyui的datagrid为何无法显示json数据
因为easyui的datagrid要求数据JSON必须是如下格式:{"total":0,"rows":[]}其中total表示总的数据行数,rows是当前页的数 ...
- 使用Git Extensions简单入门Git
前言 关于这个主题,之前我录了段视频教程,在本地看清晰度还可以,但传到优酷上就很不清晰了,即使是后来重制后还是一样不清晰,所以现在想整理成文字版.当然,大家还可以将我百度云上的视频下载下来观看,连同优 ...
- java Future用法和意义一句话击破
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是void类型. 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使 ...
- csharp: using HtmlAgilityPack and ScrapySharp reading Url find text
https://github.com/exaphaser/ScrapySharp https://github.com/zzzprojects/html-agility-pack https://gi ...
- 洛谷P3899 [湖南集训]谈笑风生(线段树合并)
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...
- fetch发送Form Data请求并携带cookie
今天我们来说说如何fetch发送Form Data请求并携带cookie,直接进入正题好吧,别问我今天为啥不在开始吹两句了,累到一句牛逼不想吹...... 步骤1: 设置头部,"Conten ...
- loadrunner 脚本优化-加密与解密
脚本优化-加密与解密 by:授客 QQ:1033553122 密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...