零基础入门学习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 ...
随机推荐
- bzoj 1923: [Sdoi2010]外星千足虫【高斯消元】
裸的异或高斯消元 #include<iostream> #include<cstdio> using namespace std; const int N=2005; int ...
- 洛谷P4315 月下“毛景树”(树剖+线段树)
传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...
- 【牛客-14602】xinjun与阴阳师(01背包)
xinjun与阴阳师 题目描述 xinjun是各类手游的狂热粉丝,因随手一氪.一氪上千而威震工大,现在他迷上了阴阳师.xinjun玩手游有一个习惯,就是经过层层计算制定出一套方案来使操作利益最大化(因 ...
- 执行linux脚本出现问题
1. 权限不够: 使用 chmod +x XXX.sh 提升权限 2. 出现:/bin/bash^M: bad interpreter: No such file or directory 原因:文件 ...
- poj 3164 Command Network (朱刘算法)
题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...
- 题解报告:poj 1195 Mobile phones(二维BIT裸题)
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- Vmware workstation12里如何正确快速安装可视化IDS系统Security Onion(图文详解)
不多说,直接上干货! 首先,大家要明确: 问:安全洋葱能阻止入侵吗? 答:这一点,和OSSIM一样,不能阻止入侵. Security Onion基于Ubuntu,包含了入侵检测.网络安全监控.日志管理 ...
- AJPFX总结final、finally、finallize的区别
final.finally.finallize有何区别? final表示一个修饰符,如果用它来修饰一个类,则该类是不能继承的:如果用它来修饰一个变量,则该变量一旦赋值之后就不能再修改:如果用它来 ...
- 5 月编程语言排行榜:Java第一,R跌出Top20
我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...
- VirtualBox Networking Model