递归与尾递归

# ### 递归函数
"""
递归函数: 自己调用自己的函数
递:去
归:回
有去有回是递归
""" # 简单递归
def digui(n):
print(n,"<===1===>")
if n > 0:
digui(n-1)
print(n,"<===2===>")
digui(5)
"""
# 代码解析:
去的过程
n = 5 print(5,"<===1===>") 5>0 满足 digui(n-1) -> digui(5-1) -> digui(4) 代码在13行,暂定阻塞
n = 4 print(4,"<===1===>") 4>0 满足 digui(n-1) -> digui(4-1) -> digui(3) 代码在13行,暂定阻塞
n = 3 print(3,"<===1===>") 3>0 满足 digui(n-1) -> digui(3-1) -> digui(2) 代码在13行,暂定阻塞
n = 2 print(2,"<===1===>") 2>0 满足 digui(n-1) -> digui(2-1) -> digui(1) 代码在13行,暂定阻塞
n = 1 print(1,"<===1===>") 1>0 满足 digui(n-1) -> digui(1-1) -> digui(0) 代码在13行,暂定阻塞
n = 0 print(0,"<===1===>") 0>0 不满足 print(0,"<===2===>") 回的过程
n = 1 从上一次13行的位置,往下执行, print(1,"<===2===>")
n = 2 从上一次13行的位置,往下执行, print(2,"<===2===>")
n = 3 从上一次13行的位置,往下执行, print(3,"<===2===>")
n = 4 从上一次13行的位置,往下执行, print(4,"<===2===>")
n = 5 从上一次13行的位置,往下执行, print(5,"<===2===>")
""" """
每调用一次函数就会开辟栈帧空间
n = 5
n = 4
n = 3
n = 2
n = 1
n = 0
n = 1
n = 2
n = 3
n = 4
n = 5
""" """
# 总结:
递归函数特点1:
有去有回是递归,去的过程是不断的开辟栈帧空间,回的过程是不断的释放栈帧空间,递归函数就是不断的开辟和释放栈帧空间的过程
递归函数特点2:
递归函数触发回的过程一共有2点:(1) 当最后一层空间所有代码执行结束的时候 (2)当函数遇到return的时候 会触发回的过程,回到上一层空间调用处
递归函数特点3:
必须给与递归函数一个跳出的条件,不能无限次的递归下去,会造成内存溢出报错,如果递归的层数过多,不推荐使用
递归函数特点4:
每次调用函数,开辟的栈帧空间,都是一个独立的个体,里面的变量,名字虽然一样,但是彼此不共享,独立的一份;
""" # 默认递归深度是1000层 , 当前电脑是995层
"""
def deep():
deep() deep()
"""

递归 示例代码

# 求5的阶乘 5! = 5*4*3*2*1

n = 5
total = 1
for i in range(5,0,-1):
total *= i
# total = total * i => 1 * 5
# total = total * i => 1 * 5 * 4
# total = total * i => 1 * 5 * 4 * 3
# total = total * i => 1 * 5 * 4 * 3 * 2
# total = total * i => 1 * 5 * 4 * 3 * 2 * 1
print(total) def jiecheng(n):
if n <= 1:
return 1
return n * jiecheng(n-1) res = jiecheng(5)
print(res)
"""
# 代码解析:
去的过程
n = 5 return n * jiecheng(n-1) => 5 * jiecheng(4)
n = 4 return n * jiecheng(n-1) => 4 * jiecheng(3)
n = 3 return n * jiecheng(n-1) => 3 * jiecheng(2)
n = 2 return n * jiecheng(n-1) => 2 * jiecheng(1)
n = 1 return 1 回的过程
n = 2 return n * jiecheng(n-1) => 2 * 1
n = 3 return n * jiecheng(n-1) => 3 * 2 * 1
n = 4 return n * jiecheng(n-1) => 4 * 3 * 2 * 1
n = 5 return n * jiecheng(n-1) => 5 * 4 * 3 * 2 * 1
return 120
""" # 尾递归: 自己调用自己,且非表达式 [在参数中进行运算]
"""
可以简化逻辑:只需要考虑去的过程,不需要考虑回的过程,减少逻辑(推荐)
去的过程,最后一层空间的返回值,就是回的过程,最上层空间所能够接受到的值 理论上,尾递归只开辟一个栈帧空间,但cpython解释器不支持,大型的服务厂商有自己独立的解释器可以支持;
"""
def jiecheng(n,endval):
if n <= 1:
return endval
return jiecheng(n-1,n*endval)
res = jiecheng(5,1)
print(res) """
# 代码解析:
去的过程
n=5,endval=1 return jiecheng(n-1,n*endval) => jiecheng(5-1,5*1) => jiecheng(4,5*1)
n=4,endval=5*1 return jiecheng(n-1,n*endval) => jiecheng(4-1,5*1*4) => jiecheng(3,5*1*4)
n=3,endval=5*1*4 return jiecheng(n-1,n*endval) => jiecheng(3-1,5*1*4*3) => jiecheng(2,5*1*4*3)
n=2,endval=5*1*4*3 return jiecheng(n-1,n*endval) => jiecheng(2-1,5*1*4*3*2) => jiecheng(1,5*1*4*3*2)
n=1,n <= 1 , return endval 回的过程
n=2 return 5*1*4*3*2
n=3 return 5*1*4*3*2
n=4 return 5*1*4*3*2
n=5 return 5*1*4*3*2
""" # 斐波那契数列: 1,1,2,3,5,8,13,21,34,55 ,.... 第n个数字是几?
def feib(n):
if n == 1 or n == 2:
return 1
return feib(n-1)+feib(n-2)
res = feib(5)
print(res) """
# 代码解析:
n = 5
return feib(4) + feib(3)
feib(4) [=>3] + feib(3) [2]
feib(3) + feib(2) feib(2) + feib(1)
feib(2) + feib(1) + 1 1 + 1
1 + 1
"""

尾递归_斐波那契数列 示例代码

day13

day13-Python运维开发基础(递归与尾递归)的更多相关文章

  1. Python运维开发基础10-函数基础【转】

    一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...

  2. Python运维开发基础09-函数基础【转】

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  3. Python运维开发基础08-文件基础【转】

    一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...

  4. Python运维开发基础07-文件基础【转】

    一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...

  5. Python运维开发基础06-语法基础【转】

    上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...

  6. Python运维开发基础05-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...

  7. Python运维开发基础04-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...

  8. Python运维开发基础03-语法基础 【转】

    上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...

  9. Python运维开发基础02-语法基础【转】

    上节作业回顾(讲解+温习60分钟) #!/bin/bash #user login User="yunjisuan" Passwd="666666" User2 ...

  10. Python运维开发基础01-语法基础【转】

    开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...

随机推荐

  1. CSS-复选框默认样式修改

    在css文件中添加如下代码 input[type='checkbox'] { -webkit-appearance: none; background: #fff url('../../static/ ...

  2. [SUCTF 2019]Pythonginx

    贴出源码 @app.route('/getUrl', methods=['GET', 'POST']) def getUrl(): url = request.args.get("url&q ...

  3. 4_4 信息解码(UVa213)<二进制:输入技巧与调试技巧>

    消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. 你的程序的编码方案的核心是一个序列的“0和1” ...

  4. 喵星之旅-狂奔的兔子-redis使用

    一.命令行使用 redis大概有200多命令,这里只是入门级别,列举了一些非常常见的内容,如果这些会了就可以开启redis进一步学习了. 1.登录数据库 我们需要知道ip地址.端口号.密码(如果有). ...

  5. ubuntu apache 通过端口新建多个站点

    cd /etc/apache2/sites-available 最近的虚拟机没绑定域名,所以呢,就先用域名加端口新建几个站点用着 1. vim /etc/apapche2/apapche2.conf ...

  6. 吴裕雄--天生自然Numpy库学习笔记:NumPy 位运算

    bitwise_and() 函数对数组中整数的二进制形式执行位与运算. import numpy as np print ('13 和 17 的二进制形式:') a,b = 13,17 print ( ...

  7. Http 状态码总结

    HTTP 状态码列表 一. 1 开头 (继续执行) 服务器收到请求,需要请求者继续执行操作 100:(continue) 客户端继续请求 101:(Switching Protocols) 切换协议, ...

  8. Codeforces Round #616 (Div. 2) D

    莫队的模板 struct node{ int l,r,id; }q[maxn]; int cmp(node a,node b) { ) ? a.r < b.r : a.r > b.r); ...

  9. iview table表格内容为数组或者对象的子元素时问题讨论

    正常情况下,iview框架table表格内容只需配置好 key 就OK, 稍微复杂点就是用一个reder函数进行操作(params.row 为本行数据) . 以上问题都很好解决,无需太动脑筋. 开发中 ...

  10. video标签 在微信浏览器打开,不弹出大的独立窗口 而是直接播放。

    1.在 video 标签中添加   属性    x5-playsinline  playsinline  webkit-playsinline="true" 2.ckplayer的 ...