代码复用和递归

简介: 代码复用和递归

文章目录


代码复用和函数递归


代码复用


模块化设计


函数递归的理解


函数递归的调用过程


递归实例


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






相关文章
|
6月前
什么是递归函数?怎样实现递归?
什么是递归函数?怎样实现递归?
|
Java 程序员 编译器
继承的巧妙
继承的巧妙
32 0
|
12天前
|
存储 开发者
递归比较的优缺点是什么?
【10月更文挑战第29天】递归比较是一种在处理复杂数据结构时常用的比较方法,尤其适用于对象和数组等引用类型数据的深度比较。
|
5月前
|
机器学习/深度学习 C语言
|
5月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
108 7
|
5月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
102 0
|
6月前
|
存储 算法 C语言
C递归程序设计
C递归程序设计
38 3
|
6月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
47 0
|
6月前
|
存储 缓存 算法
程序设计中的递归思想与实践
程序设计中的递归思想与实践
44 0
|
6月前
|
算法 数据库
10.如何正确编写递归
10.如何正确编写递归
37 0