零基础入门学习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 ...
随机推荐
- 【插件开发】—— 6 SWT 复杂控件使用以及布局
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 前几篇讲到了简单控件的使用,复杂控件使用原则上与 ...
- vim下撤销操作.选中复制等操作
vim撤销操作:u vim恢复操作:ctrl+r 使用normal模式下的 v命令,进入visual模式,v+ j/k/h/l 进行文本选中 对于选中的文本进行如下按键: (1.1)d -- ...
- 倒排索引构建算法BSBI和SPIMI
参考:https://blog.csdn.net/androidlushangderen/article/details/44889677 倒排索引 : 一般的索引检索信息的方式.比如原始的数据源假设 ...
- bitset优化背包问题
https://blog.csdn.net/HowardEmily/article/details/77340566 留坑待填
- 字符串处理 BestCoder Round #43 1001 pog loves szh I
题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...
- 题解报告:hdu 1159 Common Subsequence(最长公共子序列LCS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description 给定序列的子序列是给定的序列,其中有一些元素(可能没有) ...
- 自定义View(11)**在onDraw中使用矩阵Matrix
1.代码示例 1.1 效果 原图 : 其尺寸为162 x 251,示例中的红点是变形的锚点. 变形之后: 1.2 代码 package com.e.weixin.session.view; impor ...
- ASP.NET MVC+Bootstrap个人博客之文章打赏(六)
看到新浪微博.百度百家等等平台上都带有文章“打赏”功能,觉得很新鲜,于是也想在自己的博客中加入“打赏”功能. 当然,加入打赏功能并非是真的想要让别人打赏.因为只有那些真正能引起共鸣,发人深思,让人受益 ...
- Webform 内置对象 Session对象、Application全局对象,ViewState
Session 每台电脑访问服务器,都有独立的session,key值都一样,内容不一样. 1.session保存在服务器上. 2.session没有持久性,保存周期就是20分钟. 重点: sessi ...
- JAVA高级特性反射和注解
反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...