知识点

  • 递归是神马?

    递归是属于算法的范畴。

    递归就是函数调用自身的一种行为。

>>> 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)--函数:递归是神马的更多相关文章

  1. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  2. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  3. 零基础入门学习Python(1)--我和Python的第一次亲密接触

    前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...

  4. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

  5. 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...

  6. 零基础入门学习Python(17)--函数:Python的乐高积木

    前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...

  7. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...

  8. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  9. 零基础入门学习Python(18)--函数:灵活即强大

    前言 上一节课我们基本介绍Python函数的用法,这一节课我们主要针对函数的参数进行进一步的深入学习. 知识点 形参(parameter)和实参(argument) >>> def ...

随机推荐

  1. Ubuntu 18.04 LTS 系统设置打不开了

    在更换软件源后,安装了vim 和chrome,chrome很顺利,但是安装vim的时候后就显示有问题了,有的依赖版本不对,嫌版本太高,卸载后再装可以. 安装了python和python2 依旧是有些依 ...

  2. apicloud踩坑集锦

    最近在用apicloud开发,这里录入一些踩坑的地方,从头到尾,要多尴尬有多尴尬,新入app开发,记录一些心得,和遇到的坑以及解决办法. 1,apicloud 打包的Android app ,打开fr ...

  3. 使用pabot并行执行robotframework用例

    主要观点:使用pabot并行运行robotframework,可以解决:robotframework执行案例时间长的问题 解决执行案例时间长的方案: 目的: 缩短案例的运行时间 两种方法: 将大的项目 ...

  4. 手机APP测试点总结(参考)

    参考链接:http://www.zengyuetian.com/?p=2305 手机APP测试点: 功能测试:多注意核心业务风险(如:注册.登录.付费.订单等) 兼容性测试:系统兼容性.硬件兼容性.软 ...

  5. [Usaco2006 Mar]Mooo 奶牛的歌声

    Description Farmer John's N (1 <= N <= 50,000) cows are standing in a very straight row and mo ...

  6. [转]linux之date命令MYSQL用户管理

    转自:http://www.cnblogs.com/hencehong/archive/2013/03/19/mysql_user.html 一.        用户登录 格式: mysql -h主机 ...

  7. Vmware workstation12里如何正确快速安装可视化IDS系统Security Onion(图文详解)

    不多说,直接上干货! 首先,大家要明确: 问:安全洋葱能阻止入侵吗? 答:这一点,和OSSIM一样,不能阻止入侵. Security Onion基于Ubuntu,包含了入侵检测.网络安全监控.日志管理 ...

  8. [转]Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法

    本文转自:http://www.cnblogs.com/gesenkof99/archive/2013/06/03/3115052.html Partial 和RenderPartial:这两个的性质 ...

  9. Android开发学习——android反编译

    第一种: 1.下载下边的三个jar包,对dex2jar和jd-gui进行解压 2.将需要反编译的apk后缀名改为.rar,然后进行解压 3.将解压后生成的classes.dex加入第一步解压后的dex ...

  10. jQuery相关知识总结

    1 encodeURIComponent(city)处理js传值乱码问题 2 总体概述 以后项目如果没有特殊情况,一般采用jQuery作为最基础的公共底层库. 另外对于前端的javascript相关的 ...