代码复用和递归

简介: 代码复用和递归

文章目录


代码复用和函数递归


代码复用


模块化设计


函数递归的理解


函数递归的调用过程


递归实例


PyInstaller库基本介绍


递归的魅力


代码复用和函数递归


代码复用


把代码当成资源进行抽象


代码资源化:程序代码是一种用来表达计算的"资源"


代码抽象化:使用函数等方法对代码赋予更高级别的定义


代码复用:同一份代码在需要时可以被重复使用


函数 和 对象 是代码复用的两种主要形式


函数:实现一个问题的解决,给代码一个名字,在代码的层面上进行初级抽象

对象:属性 和 方法,<a>.<b> 和 <a>.<b>(),在函数之上再次进行抽象


模块化设计


分而治之


通过函数或对象封装将程序划分为模块及模块间的表达

具体包括:主程序、子程序和子程序间关系


分而治之:分而治之、分层抽象、体系化的设计思想


紧耦合 松耦合


紧耦合:两个部分之间交流很多,无法独立存在。

松耦合:两个部分之间交流较少,可以独立存在。

模块内部紧耦合、模块之间松耦合。


函数递归的理解


函数定义中调用函数自身的方式(自己调用自己)


两个重要特征:


链条:计算过程存在递归链条

基例:存在一个或多个不需要再次递归的基例


所谓链条就是反复调用自己,但不可以是没有尽头的,存在递归头递归尾,没有尽头也就是所谓基例,二者缺一不可。


数学归纳法


证明当n取第一个值n0时命题成立

假设当nk时命题成立,证明当n=nk+1时命题也成立


递归是数学归纳法思维的编程体现


函数递归的调用过程


n的阶乘用Python递归代码完成


def fact(n):
  if n == 0 :
  return 1
  else :
  return n*fact(n-1)


递归的基本实现需要 函数 + 分支语句


递归本身是一个函数,需要函数定义方式描述

函数内部,采用分支语句对输入参数进行判断


基例和链条,分别编写对应代码


调用过程:


20210630111740161.png


递归实例


字符串反转

其实之前就学过字符串的切片操作,就可以完成字符串的反转。s[::-1]它表示这个字符串从前到后参数-1让它反转。接下来我们用递归试着实现。


def fz(s):
    if s=="":
        return s
    else:
        return fz(s[1:])+s[0]


通过定义函数使得它可以调用自己,然后通过分支,如果字符串是空,那么返回空,否则我们将字符串进行切片,除去第一个字符其他全部反转,然后将第一个字符放在反转好的字符后面,实现整体的反转。


斐波那契数列


def f(n):
  if n==1 or n==2:
  return 1
  else:
  return f(n-1) +f(n-2)


这个很简单,直接通过定义写出来就好了


领会:递归是一种思维,而我们将这种思维交给计算机完成时,我们只需要将问题拆分成 n 和 n-1 的阶乘的问题,至于这些计算机如何实现,我们不去关心。


递归其实很简单,就是自己调用自己,使用递归可以用很少量的代码实现一些很棘手麻烦的问题。


A:从前有个庙,庙里有个老和尚,老和尚在讲故事

A:在讲什么故事?


A:从前有个庙,庙里有个老和尚,老和尚在讲故事

A:在讲什么故事?

A:……


PyInstaller库基本介绍



将.py源代码转换成无需源代码的可执行文件

(01文件,好处跨平台,无需环境一样执行)


PyInstaller库是第三方库


官方网站:http://www.pyinstaller.org

第三方库:使用前需要额外安装


安装第三方库需要使用pip工具


(cmd命令行) pip install pyinstaller


20210630122111711.gif


等它跑完


2021063012220090.png


看到这个说明🆗了,下面还有路径。好,欧克,说说怎么生成可执行文件


我们打开写好的代码的文件夹

20210630122630807.png

20210630122641260.png


进来


20210630122710568.png


这里输入cmd,注意空格,进入我们当前目录的命令行窗口


20210630122831632.png


输入 pyinstaller -F 文件名

我这个文件名是 七段数码管.py


20210630123040269.png


然后回车,稍等……


20210630123031929.png


然后我们看到building EXE successfully,说明已经生成了EXE文件。


返回文件,我们可以看到多出来了很多文件


20210630123359948.png


我们打开dist文件夹,就可以看到打包好的exe文件了。


20210630123514777.png


这相当于01010二进制代码,可跨平台,不需要Python环境,nice


20210630123842763.png


这是库的一些常用命令


递归的魅力


目的:

理解递归,感受递归的魅力

实现效果:


20210630133615192.gif


科赫雪花绘制


20210630131808850.webp.jpg


递归思想:函数+分支

递归链条:线段的组合

递归基例:初始线段


这个就相当于一条直线,平分3份,去掉中间的一份,画一个60°的三角,之后被划分成了四条线,四条都做上一步的3等分话三角,于是我们先用函数完成这个然后用递归,自己调用自己


首先,引入turtle库,递归写函数,给两个参数size长度,n来表示阶数


import turtle as t
def k(size, n):
    if n == 0:
        t.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            t.left(angle)
            k(size/3, n-1)


下面定义主函数


def main():
    t.setup(600,600)
    t.penup()
    t.goto(-210, 130)
    t.pendown()
    t.pensize(1)
    n = 3
    k(400, n)
    t.hideturtle()
    input()
main()


input()使画完不会退出程序,好好欣赏


但是我们发现结果好像没有那个效果,想要实现雪花的效果,❄,也很简单,只要让海龟旋转3次,实现180°等边三角即可实现


完整代码:


import turtle as t
def k(size, n):
    if n == 0:
        t.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            t.left(angle)
            k(size/3, n-1)
def main():
    t.setup(600,600)
    t.penup()
    t.goto(-210, 130)
    t.pendown()
    t.pensize(1)
    n = 3
    k(400, n)
    t.right(120)
    k(400, n)
    t.right(120)
    k(400, n)
    t.hideturtle()
    input()
main()


最后给我们的代码打包,可以发给小伙伴。哈哈哈

图标这里要用 .ico格式的文件,可以在网上找一个转一下格式就🆗了


20210630135916569.png

20210630140013647.png


输入以下命令


34.png


打包完成

Perfect






相关文章
|
存储 算法 Python
一文速学-时间序列分析算法之指数平滑法详解+Python代码实现
一文速学-时间序列分析算法之指数平滑法详解+Python代码实现
3023 0
一文速学-时间序列分析算法之指数平滑法详解+Python代码实现
|
JavaScript 前端开发 Android开发
kotlin开发 webview如何在收到JS调用后,native返回数据给到JS
这段内容描述了在Hybrid App开发中,使用Kotlin的Compose构建的Web视图(WebView)如何通过JsBridge实现JavaScript与原生代码的交互
|
8月前
|
存储 算法 数据安全/隐私保护
基于风险的完整性和检查建模(RBIIM)MATLAB仿真
本程序为基于风险的完整性和检查建模(RBIIM)的MATLAB仿真,适用于评估和优化资产完整性管理计划,特别针对石油化工等领域的管道、储罐等设备。程序在MATLAB 2022A版本下运行,对比了先验密度(Prior Density)、后验完美检测(Posterior Perfect Inspection)、后验不完美检测(Posterior Imperfect Inspection)及累积后验不完美检测四个关键指标。算法采用贝叶斯统计框架,通过更新资产健康状况估计,制定最佳维护与检查策略。示例展示了核心原理与运行效果,完整程序无水印。
|
Java 调度
【多线程-从零开始-贰】线程的构造方法和常见属性
【多线程-从零开始-贰】线程的构造方法和常见属性
89 0
|
Python
【Leetcode刷题Python】236. 二叉树的最近公共祖先
LeetCode上236号问题"二叉树的最近公共祖先"的Python实现,使用递归方法找到两个指定节点的最近公共祖先。
140 5
|
存储 人工智能 弹性计算
智库观察|面向公共服务与治理的行业大平台建设正当其时
“行业大平台”建设在公共服务和治理领域各行业数字化转型中尤为关键,意义重大。但这也是一个复杂的系统工程,在规划阶段就需从多角度综合筹划,形成一个整体蓝图与实施路径。
340 1
|
小程序
【边做边学】uniapp里面的生命周期钩子函数
【边做边学】uniapp里面的生命周期钩子函数
520 0
|
Oracle 网络协议 关系型数据库
|
安全 Java 关系型数据库
分布式整合之认证模块搭建|学习笔记
快速学习学习分布式整合之认证模块搭建
分布式整合之认证模块搭建|学习笔记