零基础入门学习Python(22)--函数:递归是神马
知识点
- 递归是神马?
递归是属于算法的范畴。
递归就是函数调用自身的一种行为。
>>> def g():
return g()
>>> g()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
g()
File "<pyshell#5>", line 2, in g
return g()
File "<pyshell#5>", line 2, in g
return g()
File "<pyshell#5>", line 2, in g
return g()
[Previous line repeated 990 more times]
RecursionError: maximum recursion depth exceeded
设置递归的深度,可以使用如下:
>>> import sys
>>> sys.setrecursionlimit(1000000) #设置递归深度为1000000层
>>>
- 递归求阶乘
写一个求阶乘的函数
正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所给的数是5,则阶乘式是1*2*3*4*5 = 120,所以120 就是5的阶乘
#常规写法:
def factorial(n):
result = n
for i in range(1, n):
result *= i
return result
number = int(input('请输入一个正整数:'))
result = factorial(number)
print("%d 的阶乘是:%d" % (number, result))
------------------------------------------------
#递归写法:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
number = int(input('请输入一个正整数:'))
result = factorial(number)
print("%d 的阶乘是:%d" % (number, result))
递归实现过程如下图所示:
课后习题
测试题
- 递归在编程上的形式是如何表现的呢?
在编程上,递归表现为函数调用本身这么一个行为。
举个例子(递归求阶层):
def jieceng(n):
if n == 1:
return 1
else:
return n * jieceng(n - 1)
number = int(input('请输入一个正整数:'))
result = jieceng(number)
print('%d的阶层是:%d' % (number,result))
- 递归必须满足哪两个基本条件?
1. 函数调用自身
2. 设置了正确的返回条件
- 思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
例如汉诺塔,目录索引(因为你永远不知道这个目录里边是否还有目录),
快速排序(二十世纪十大算法之一),树结构的定义等如果使用递归,会事半功倍,
否则会导致程序无法实现或相当难以理解。
- 用递归去计算阶层问题或斐波那契数列是很糟糕的算法,你知道为什么吗?
小甲鱼在课程的开头说“普通程序员用迭代,天才程序员用递归”这句话是不无道理的。
但是你不要理解错了,不是说会使用递归,把所有能迭代的东西用递归来代替就是“天才程序员”了,
恰好相反,如果你真的这么做的话,那你就是“乌龟程序员”啦。
为什么这么说呢?不要忘了,递归的实现可以是函数自个儿调用自个儿,每次函数的调用
都需要进行压栈、弹栈、保存和恢复寄存器的栈操作,所以在这上边是非常消耗时间和空间的。
另外,如果递归一旦忘记了返回,或者错误的设置了返回条件,那么执行这样的递归代码就会变
成一个无底洞:只进不出!所以在写递归代码的时候,千万要记住口诀:
递归递归,归去来兮!出来混,总有一天是要还的!
- 请聊一聊递归的优缺点
优点:
1. 递归的基本思想是把规模大的问题转变成规模小的问题组合,从而简化问题的解决难度(例如汉诺塔游戏)。
2. 有些问题使用递归使得代码简洁易懂(例如你可以很容易的写出前中后的二叉树遍历的递归算法,但如果要写出相应的非递归算法就不是初学者可以做到的了。)
缺点:
1. 由于递归的原理是函数调用自个儿,所以一旦大量的调用函数本身空间和时间消耗是“奢侈的”
2. 初学者很容易错误的设置了返回条件,导致递归代码无休止调用,最终栈溢出,程序奔溃。
动动手
- 使用递归编写一个power()函数模拟内建函数pow(),即power(x,y)为计算返回x的y次幂的值。
#常规写法:
def power(x,y):
result = 1
for i in range(y):
result *= x
return result
power(3,4)
81
#递归写法:
def power(x,y):
if y == 0:
return 1
else:
return x * power(x,y-1)
power(3,4)
81
- 使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。
#常规写法
def gcd(x, y):
while y: # -->6 -->4 -->2 -->0
t = x % y # -->4%6=4 -->6%4=2 -->4%2 =0
x = y # -->6 -->4 -->2
y = t # -->4 -->2 -->0
return x
print(gcd(4, 6))
#递归写法
def gcd(x,y):
if y:
return gcd(y,x%y)
else:
return x
gcd(4,6)
2
零基础入门学习Python(22)--函数:递归是神马的更多相关文章
- 【Python教程】《零基础入门学习Python》(小甲鱼)
[Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609
- 《零基础入门学习Python》【第一版】视频课后答案第001讲
测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...
- 零基础入门学习Python(1)--我和Python的第一次亲密接触
前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...
- 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案
国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...
- 零基础入门学习Python(17)--函数:Python的乐高积木
前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...
- 零基础入门学习Python(20)--函数:内嵌函数和闭包
知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...
- 零基础入门学习Python(36)--类和对象:给大家介绍对象
知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...
- 零基础入门学习Python(18)--函数:灵活即强大
前言 上一节课我们基本介绍Python函数的用法,这一节课我们主要针对函数的参数进行进一步的深入学习. 知识点 形参(parameter)和实参(argument) >>> def ...
随机推荐
- Spring Boot:关于“No converter found for return value of type: class xxx”的解决方法
首先在对应的controller中的@RestController中返回json对象的操作 public class HelloController { @RequestMapping("/ ...
- sql server 改sa 密码
ALTER LOGIN sa ENABLE ; ALTER LOGIN sa WITH PASSWORD = 'kongwenyi' ;
- Kruskal HDOJ 4313 Matrix
题目传送门 题意:如何花最小的代价使得一棵树划分开且不含同类节点 分析:当一条边连接的左右集合同类点小于等于1,那么不用删除,将两个集合合并,要求最小代价,那么贪心思想将权值降序排序,删除后剩下的就是 ...
- 彩色模型 分类: 图像处理 Matlab 2015-01-08 20:43 364人阅读 评论(0) 收藏
彩色模型(又称彩色空间或彩色系统)是描述色彩的一种方法,本质上,彩色模型就是坐标系统和子空间的规范,系统中的每种颜色由单个点来表示.下面介绍两种最常用的彩色模型. 一.RGB彩色模型: RGB模型是最 ...
- MAT使用入门
原文出处: 高建武 (Granker,@高爷) MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具, ...
- [转]ASP.net MVC 2 自定义模板来显示数据
本文转自:http://blog.163.com/liaojunbo@126/blog/static/1394892972012113104653651/ 在ASP.net MVC 2中,一个很有意思 ...
- Android开发学习—— 消息机制
###主线程不能被阻塞* 在Android中,主线程被阻塞会导致应用不能刷新ui界面,不能响应用户操作,用户体验将非常差* 主线程阻塞时间过长,系统会抛出ANR异常* ANR:Application ...
- 初学Ajax
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...
- (四)SpringIoc之Bean装配
在pom.xml的依赖 <dependencies> <!--测试包--> <dependency> <groupId>junit</groupI ...
- javascript中函数的四种调用模式详解
介绍函数四种调用模式前,我们先来了解一下函数和方法的概念,其实函数和方法本质是一样,就是称呼不一样而已.函数:如果一个函数与任何对象关系,就称该函数为函数.方法:如果一个函数作为一个对象属性存在,我们 ...