知识点

  • 递归是神马?

    递归是属于算法的范畴。

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

>>> 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. 【插件开发】—— 6 SWT 复杂控件使用以及布局

    前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 前几篇讲到了简单控件的使用,复杂控件使用原则上与 ...

  2. vim下撤销操作.选中复制等操作

    vim撤销操作:u vim恢复操作:ctrl+r 使用normal模式下的  v命令,进入visual模式,v+ j/k/h/l   进行文本选中 对于选中的文本进行如下按键: (1.1)d   -- ...

  3. 倒排索引构建算法BSBI和SPIMI

    参考:https://blog.csdn.net/androidlushangderen/article/details/44889677 倒排索引 : 一般的索引检索信息的方式.比如原始的数据源假设 ...

  4. bitset优化背包问题

    https://blog.csdn.net/HowardEmily/article/details/77340566 留坑待填

  5. 字符串处理 BestCoder Round #43 1001 pog loves szh I

    题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...

  6. 题解报告:hdu 1159 Common Subsequence(最长公共子序列LCS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description 给定序列的子序列是给定的序列,其中有一些元素(可能没有) ...

  7. 自定义View(11)**在onDraw中使用矩阵Matrix

    1.代码示例 1.1 效果 原图 : 其尺寸为162 x 251,示例中的红点是变形的锚点. 变形之后: 1.2 代码 package com.e.weixin.session.view; impor ...

  8. ASP.NET MVC+Bootstrap个人博客之文章打赏(六)

    看到新浪微博.百度百家等等平台上都带有文章“打赏”功能,觉得很新鲜,于是也想在自己的博客中加入“打赏”功能. 当然,加入打赏功能并非是真的想要让别人打赏.因为只有那些真正能引起共鸣,发人深思,让人受益 ...

  9. Webform 内置对象 Session对象、Application全局对象,ViewState

    Session 每台电脑访问服务器,都有独立的session,key值都一样,内容不一样. 1.session保存在服务器上. 2.session没有持久性,保存周期就是20分钟. 重点: sessi ...

  10. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...