【Python全栈笔记】08 [模块二] 20 Oct 递归 -*** 待补充
递归
引入 递归的表现形式
下面是四个函数,互相调用返回结果
# 引入 递归的表现形式 def f1():
return '' def f2():
r = f1()
return r def f3():
r = f2()
return r def f4():
r = f3()
return r result = f4()
print(result)
# 最后输出结果 1
除了依次调用其他函数,函数也可以调用自己
下面的f1()函数一直在调用自己,相当于一个死循环,python内部有机制,当递归调用到一定数量的时候就会报错停止调用了。
def f1():
f1() f1() # 报错: RecursionError: maximum recursion depth exceeded
经典的递归用法有斐波那契数列:
# 递归的典型应用,斐波那契数列
def fib(x, y): if x + y > 1000:
return
z = x + y
fib_list.append(z)
fib(y, z)
return fib_list fib_list = [0, 1]
result = fib(0, 1)
print(result)
# 得到结果:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
斐波那契数列加上循环的次数限制:
# 执行了10次后斐波那契数列的结果 def fib_counts(counts, x, y):
if counts == 11:
return fib_list
z = x + y
fib_list.append(z)
r = fib_counts(counts + 1, y, z)
return r fib_list = [0, 1]
result = fib_counts(1, 0, 1)
print(result)
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
注意:继续调用函数要有一个返回值来return
课堂失败案例:
def num(a, b, n):
if n == 10:
return a
c = a + b
num(b, c, n+1)
return a
s = num(0, 1, 1)
print(s)
# 上面的num(b, c, n+1) 没有返回,直接返回了传入的最原始参数a 结果为0
# 因为下一次执行的函数拿到数值后要往上一层传递,但是上一层没有接收的地方,等于无用功 # 修改成如下即可:
def num(a, b, n):
if n == 10:
return a
c = a + b
r = num(b, c, n+1)
return r s = num(0, 1, 1)
print(s)
# 结果返回34
补充:
汉诺塔递归
【Python全栈笔记】08 [模块二] 20 Oct 递归 -*** 待补充的更多相关文章
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈day21-22-23(模块)
一,python的模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
- 【Python全栈笔记】07 [模块二] 20 Oct 冒泡排序
给出一个列表,进行冒泡排序 原理算法: li = [52, 37, 23, 11, 3, 1, ] print(li) # 每次循环,进行一次排序,列表内数字两两比较,最大的数字排到最末尾 # 一共循 ...
- 【Python全栈笔记】03 [模块二] 16-17 Oct 函数
定义一个函数 def function_name(形式参数): 代码块 return 'Value' #如果没有写return,则默认返回None # 一个函数到return这一行就结束执行了,在re ...
- 【Python全栈笔记】01 [模块二] 14-15 Oct 运算符和字符串 4-1
编码的问题 中文版 Windows 终端是默认GBK编码格式,python2默认为ASCII编码,虽然我们注释了需要用UTF-8,但是通过命令行运行的文件如果print中文内容还是会出现乱码. Uni ...
- 【Python全栈笔记】04 [模块二] 18 Oct lambda表达式, 内置函数
lambda表达式 lambda表达式是函数的一种简化,如下面两种函数定义方法,实际上效果是一样的. 使用lambda表达式的函数,func2是函数名,lambda: 后面的123 即为返回值. de ...
- 【Python全栈笔记】05 [模块二] 19 Oct 文件的操作
文件操作 一般步骤1. 文件打开 2. 文件操作 3. 文件关闭 1. 打开文件 使用open(文件名(绝对路径), 打开模式, 编码) 文件打开的模式有: r: 只读模式(默认) w: 只写模式 ...
- 【Python全栈笔记】03 [模块二] 16-17 Oct Set 集合,三目运算
Set 集合 set - unordered collections of unique elements 创建一个set/一个空set # create a new set set1 = {1,2, ...
随机推荐
- android 自定义View onMeasure中 super.onMeasure 和 setMeasuredDimension
练习写一个自定义的view,代码是抄网上的,第一次写,没有问题,与网上的示例一样的效果, 第二次.第三次,都出现问题,但是解决了. 昨天进行第四次写再写,又出问题不一样的问题了. 首先是想加一个子包, ...
- iOS开发之CocoaPods的使用
你开发iOS的方式还是石器时代吗?在这个世界上并不是所有的软件开发人员都是码农.在这个世界上有很多的geek存在他们为这个语言的发展做出了很大的贡献.现在随着iOS开发者的曾多也就出现了iOS程序猿提 ...
- Url路径重写的原理
ASP.net的地址重写(URLRewriter)实现原理及代码示例 吴剑 2007-01-01 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 概述 访问 ...
- Ultra Video Splitter & Converter
1. Video Splitter http://www.aone-soft.com/splitter.htm Ultra Video Splitter 是一款视频分割工具.可将一个巨大的AVI/Di ...
- onethink连接操作 sqlite 数据库
直接上干货:一个简单的demo onthink本身已经有sqlite数据库的驱动 不需要在下载 common下面的config文件: 'SQLITE'=> array( 'DB_TYPE' =& ...
- According to TLD or attribute directive in tag file, attribute test does not accept any expressions
HTTP Status 500 - /WEB-INF/views/emp/list.jsp (line: 30, column: 4) According to TLD or attribute di ...
- Struts2 XML配置详解
struts官网下载地址:http://struts.apache.org/ 1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1. 包配置: S ...
- location.hash详解
一.#的涵义 #代表网页中的一个位置.其右面的字符,就是该位置的标识符.比如, http://www.example.com/index.html#print 就代表网页index.html的prin ...
- Android 5.0属性
//水波纹效果//v 指定控件 x屏幕的 x轴 y轴 endRadio 起始位置 水波半径Animator circularReveal = ViewAnimationUtils.createCirc ...
- DHCP snooping
DHCP snooping 技术介绍 DHCP监听(DHCP Snooping)是一种DHCP安全特性.Cisco交换机支持在每个VLAN基础上启用DHCP监听特性.通过这种特性,交换机能够拦截第 ...