代码复用和递归

举报
周棋洛 发表于 2022/05/26 01:14:28 2022/05/26
【摘要】 学习自中国大学mooc 文章目录 代码复用和函数递归代码复用模块化设计函数递归的理解函数递归的调用过程递归实例PyInstaller库基本介绍递归的魅力 代码复用和函数递归 代...

在这里插入图片描述
学习自中国大学mooc

代码复用和函数递归


代码复用

把代码当成资源进行抽象

  • 代码资源化:程序代码是一种用来表达计算的"资源"
  • 代码抽象化:使用函数等方法对代码赋予更高级别的定义
  • 代码复用:同一份代码在需要时可以被重复使用

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

函数:实现一个问题的解决,给代码一个名字,在代码的层面上进行初级抽象
对象:属性 和 方法,<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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

  • 递归本身是一个函数,需要函数定义方式描述
  • 函数内部,采用分支语句对输入参数进行判断
  • 基例和链条,分别编写对应代码

调用过程:
在这里插入图片描述

递归实例

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

  1. 斐波那契数列
def f(n):
	if n==1 or n==2:
		return 1
	else:
		return f(n-1) +f(n-2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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


领会:递归是一种思维,而我们将这种思维交给计算机完成时,我们只需要将问题拆分成 n 和 n-1 的阶乘的问题,至于这些计算机如何实现,我们不去关心。
递归其实很简单,就是自己调用自己,使用递归可以用很少量的代码实现一些很棘手麻烦的问题。

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

在这里插入图片描述


PyInstaller库基本介绍

将.py源代码转换成无需源代码的可执行文件
(01文件,好处跨平台,无需环境一样执行)

PyInstaller库是第三方库

  • 官方网站:http://www.pyinstaller.org
  • 第三方库:使用前需要额外安装
  • 安装第三方库需要使用pip工具

(cmd命令行) pip install pyinstaller

在这里插入图片描述
等它跑完
在这里插入图片描述
看到这个说明🆗了,下面还有路径。好,欧克,说说怎么生成可执行文件

我们打开写好的代码的文件夹
在这里插入图片描述

在这里插入图片描述
进来
在这里插入图片描述
这里输入cmd,注意空格,进入我们当前目录的命令行窗口
在这里插入图片描述
输入 pyinstaller -F 文件名
我这个文件名是 七段数码管.py
在这里插入图片描述

然后回车,稍等……
在这里插入图片描述
然后我们看到building EXE successfully,说明已经生成了EXE文件。

返回文件,我们可以看到多出来了很多文件
在这里插入图片描述
我们打开dist文件夹,就可以看到打包好的exe文件了。
在这里插入图片描述
这相当于01010二进制代码,可跨平台,不需要Python环境,nice
在这里插入图片描述
在这里插入图片描述
这是库的一些常用命令


递归的魅力

目的:
理解递归,感受递归的魅力
实现效果:
在这里插入图片描述

科赫雪花绘制

在这里插入图片描述

  • 递归思想:函数+分支
  • 递归链条:线段的组合
  • 递归基例:初始线段

这个就相当于一条直线,平分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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

下面定义主函数

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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

最后给我们的代码打包,可以发给小伙伴。哈哈哈
图标这里要用 .ico格式的文件,可以在网上找一个转一下格式就🆗了
在这里插入图片描述

在这里插入图片描述
输入以下命令

在这里插入图片描述
打包完成
Perfect
在这里插入图片描述


在这里插入图片描述


自己想要什么,不是别人期望你要什么 Bye~~~

文章来源: blog.csdn.net,作者:周棋洛ყ ᥱ ᥉,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_53321320/article/details/118355457

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。