python 代码复用与模块化设计 函数递归

代码复用

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

函数:将代码命名    在代码层面建立了初步抽象
对象:属性和方法    在函数之上再次组织进行抽象

分而治之

通过函数和对象封装将程序划分为模块及模块间的表达
我们要清楚主程序、子程序和子程序之间的关系
一般将子程序看作模块,主程序看作模块与模块之间的关系
分而治之的思想是模块化设计的核心
分而治之:一种分而治之、分层抽象、体系化的设计思想

 模块设计

紧耦合:两个部分之间的交流很多,无法独立存在
松耦合:两个部分之间的交流很少,可以独立存在
模块内部紧耦合,模块之间松耦合

函数递归

调用函数自身的方式就是递归,递归有两个关键特征
链条:计算过程存在递归链条
基例:存在一个或多个不需要再次递归的基例
这两种关键特征就构成了递归的定义

n!(n的阶乘 )

 定义值  n! 在n=0是为1,这就是一种基例

它与其他的值之间并不存在递归关系

它已经是递归的最末端

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


函数递归的调用过程

#递归的实现为 :函数+分支语句  递归本身是一个函数,需要函数定义方式描述
#函数内部,采用分支语句对输入参数进行判断,基例和链条,分别编写对应代码
#递归的调用过程事实上就是函数的计算机运算过程
def fact(n):
    if n==0:
        return 1
    else:
        return n*fact(n-1)
a=fact(5) #递归调用
print(a)

 小例子1:字符串的反转

#将字符串s反转后输出
#方法一:我们可以使用字符串的切片方式进行反转 s[::-1]
#方法二:使用递归方式实现字符串反转
#函数+分支结构(区分递归链条和递归基例)
def rvs(s):
    if s=="": #字符串s的最小形式是空字符串,它的反转就是它自己
        return s
    else:
        return rvs(s[1:])+s[0]#将首字符放到其余字符的最后(我不理解)
print(rvs("012345"))

 说实话字符串切片我还不是很理解

尤其是放到实例中呜呜呜呜

小例子2:斐波那契数列 

#函数+分支结构  递归链条  递归基例
#斐波那契数列中有两个基例  当n=1、n=2的时候 它的返回值都是1
def f(n):
    if n==1 or n==2:
        return 1
    else:
        return f(n-1)+f(n-2)
print(f(5))

 小例子3:汉诺塔问题

count=0
def hnt(n,first,last,mid): #第一个参数代表n个圆盘,第二个参数代表源柱子,第三个参数代表目标柱子,第四个参数代表中间过渡柱子
    global count
    if n==1:
       print("{}:{}->{}".format(1,first,last))
       count+=1
    else:
        hnt(n-1,first,mid,last)
        print("{}:{}->{}".format(n,first,last))
        count+=1
        hnt(n-1,mid,last,first)
hnt(3,"A","C","B")
print(count)

实例对现阶段的我来讲

还有一点看不懂呜呜呜

要努力呦!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据的小数据孩儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值