Python:代码复用与函数递归

前言:代码复用与函数递归是Python函数的较高阶应用,通过对代码复用和函数递归的学习,我们可以写出更为复杂或巧妙的函数,从而使程序设计变得更加方便,对于解决相应的问题也有极大的帮助。但对于代码复用与函数递归的理解十分抽象,所以在这一模块应反复摸索,直到灵活使用。

Ⅰ代码复用:

概念:把代码当成资源进行抽象

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

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

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

模块化设计:

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

紧耦合与松耦合

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

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

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

★Ⅲ函数递归:

概念:函数定义中调用函数自身的方式

  1. 函数递归的两个关键特征:

①链条:函数计算过程中存在链条

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

(2):函数递归的调用过程:

函数+分支语句

例:

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

 

如以上代码所示,当n≠0时,我们用return返回到n*fact(n - 1),直到n=0时,返回1,则相当于我们算出了n!(n的阶乘)。

函数递归实例解析:

-函数+分支结构

-递归链条

-递归基例

基本步骤:

 

例① 字符串反转:

解析:首先定义一个函数rvs,它的参数就是字符串s,接着构造if、else的分支结构判断基例,如果s为空字符串,则它的反转就是它自己;如果字符串不是空,我们需要确定递归链条,即当前操作和之前的一步之间的关系,为了将s反转,我们可以将首字符放在其余字符的后面,不断执行该过程则实现了s整个字符串的反转。通过将该函数进行调用:

 def rvs(s):
     if s=="":
         return s
     else:
         return rvs(s[1:])+s[0]
 a = rvs("three")
 print(a)

我们可以得到:

 

例② 斐波那契数列的实现:

问题描述:斐波那契数列指的是这样一个数列0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。根据信息分析链条与基例写出程序:

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

通过调用该函数,我们可以得到斐波那契数列的任意一项:

def f(n):
    if n <= 1:
        return n
    else:
        return(f(n-1) + f(n-2))
 a = f(10)
 print(a)

 

例③ 汉诺塔问题:

问题描述:汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

 

问题分析:

汉诺塔解法总结起来有三步骤:

设一共有N个盘子:

(1)把 N-1个盘子 移到中转柱
(2)把第N个盘子移动到 目标柱
(3)把中转柱上面的N-1个盘子借助目前空闲的柱子 移动到 目标柱。

Ps:以上的中转柱,起始柱,是会变化的。每一层递归的逻辑都是,借助"目标柱子",将n-1个 盘子移动到 “中转柱”,然后再将最后一个盘子移动到"目标柱子",再将中转柱上的盘子按照同样的规律移动到"目标柱子"。使用代码表示出思路:

count = 0
def hanoi(n,src,dst,mid):
    global count
    if n==1:
        print("{}:{}->{}".format(1,src,dst))
        count+=1
    else:
        hanoi(n-1,src,mid,dst)
        print("{}:{}->{}".format(n,src,dst))
        count += 1
        hanoi(n-1,mid,dst,src)
hanoi(3,"A","C","B")
print(count)

运行:

 

我们就可以得到三个盘子的移动规律和需要的步数。

总结:Python函数的代码复用和函数递归理解起来相对困难,但可以从给出的实例看出,它们确实更加快捷准确地解决了较为复杂的问题。一分耕耘,一分收获。通过对代码复用和函数递归的学习与理解,一定会让我们的编程思路大大提高!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Algorithm-007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值