python递归函数详解

article/2025/10/25 2:29:37

python递归函数是指一个函数从一个状态开始,然后返回另一个状态。递归函数是在实现过程中遇到的最基本的一类函数。比如, int i=0; int j=0; int c=1;等等都是一类递归函数,但是我们知道,它们在实现过程中需要执行多次,并且执行完第一次之后就不能再执行第二次了。为了解决这个问题,我们需要使用递归函数。

这里给大家讲一个很简单的例子:

这是一个非常简单的递归函数,但是我们要问问大家:为什么这个递归函数要在c里面写呢?而且我们的程序还要运行多次呢?

那么接下来,我们就一起来看一下:为什么要把程序运行多次呢?

首先,我们来看一下递归函数的定义:

递归函数是指:如果要想使用一个函数,那么我们就需要先定义这个函数,然后再调用它,最后才能返回。

在上面的例子中,我们输入两个数据,其中第一个数据是5-20-10;第二个数据是5-20-10。

如果我们直接调用5-20-10的递归函数,那么就会导致:

1.我们需要先定义一个5-20-10的递归函数(如: int i=0; int j=0; int c=1等等)

所以,在这个例子中,我们需要定义一个5-20-10的递归函数,然后再调用5-20-10的递归函数。

在上面的例子中,我们就是这样做的。那么,我们是怎么把这个递归函数写到c里面去了呢?下面我们就一起来看一下:

然后,我们再来看一下:

a=b;这是一个简单的递归函数,在这里我们要使用一个条件判断语句,以便于我们能够快速的找到它的正确返回值。

b=a;这是一个循环语句,可以用来判断A、B两个条件是否满足,即A+B=0;或者B+A=1,A和B两个条件是否满足。注意这里的“不满足”是指A和B两个条件不能同时满足,即A+B=1.

a+b;这是一个递归函数,我们要判断a、b是否等于2。当a=b时,判断结果为2.当a=1时,判断结果为1.

如果我们使用递归函数的话,那么我们就可以省去很多繁琐的步骤,在c里面就能完成。

我们来看一下:当a=b时,可以这样写:

这是一个简单的递归函数,我们只要写一个循环语句就可以了。如下:

很明显,我们看到这样的函数确实非常简单。那么我们再来看看:如果在c里面用递归函数来实现的话,这两个条件有没有可能同时满足呢?答案是肯定的。因为c里面也可以用递归函数。

比如这样的:

这是一个递归函数了吧?其实并不是,因为它其实可以用其他方法来实现的:

我们来看一下C语言里面的表达式运算符:

当a=b时,就可以直接使用表达式运算符来进行运算了。

接下来,我们再来看一下,如果我们在一个函数中执行多个操作,会出现什么情况?

这个时候,我们就可以使用递归函数了。然后,我们再把一个递归函数套入到另一个程序中,这样,我们就可以在另外一个程序中直接调用这个递归函数了。当然,对于递归函数来说,最重要的一点是,在调用了递归函数之后,我们应该把函数的参数传递给另一个函数。

还是以上面的例子为例,我们在最后一次调用递归函数的时候,把参数传递给了B。然后如果B在后面也调用了递归函数C呢?

在这里就会出现一个问题了:B是如何把参数传递给C呢?如果B不把参数传递给C,那B是不是就不会被调用了?显然是不会的。我们只要在递归函数的代码中加入一句话就可以了:

那么接下来,我们就来看一下这个递归函数的具体实现。在代码中,我们定义了一个 int a=0;参数a和参数b。然后需要注意的是:

接下来就是编译期的时候了,我们会发现:

实际上,这个递归函数并没有执行完。也就是说,当我们在调用完递归函数之后(这里就不需要调用B了),C还会再执行一遍递归函数A。也就是说,即使我们在递归函数中加入了一个参数a和参数b。但是因为两个参数并没有被传递到C里面去。所以最终,我们并没有改变递归函数A的输出结果。

另外一个问题就是:递归函数C在执行一次之后就不能再执行第二次了。因此当我们再次使用递归函数C时,C必须重新执行一遍递归函数A (代码中不需要调用B)。

那到底怎么去解决这个问题呢?很简单:你只需要把递归程序源码中的参数a和参数b替换成一个新的变量c就可以了。

这里是我的个人博客:代码实践。如果有什么疑问或者想了解更多 Python知识的朋友们可以随时关注我的博客: python编程实践

接下来,我们来看一下:

在上面的代码中,我们用 if语句判断是否为真,如果不是真就返回 true,并调用 printf ()函数。我们可以看到,这是一个循环,而我们在第一次执行的时候,都是需要调用 printf ()函数的。

但是下面这段代码却不一样。这段代码并没有调用 printf ()函数,而是在循环中调用了一次 printf ()函数。而这段代码是 python的标准操作流程:

先看一下:在第一次执行的时候,我们都是调用 printf ()函数,而 printf ()函数里面是这样写的:

我们可以看到上面的程序还没有结束,还有第三次循环。我们可以看到:第三次循环还是没有结束,而是在循环中又调用了一次 printf ()函数。这说明了什么呢?说明了 python中的递归调用是一种不可逆的调用。

那么上面这段程序为什么要在c里面写呢?原因很简单:因为要确保我们不会再调用其他的函数了。在C里面写的好处是我们可以随时停下来检查一下,这样可以避免发生一些错误。

然后,当我们想要返回一个函数的值时,程序中又会出现什么情况?

当我们想要返回一个函数的值时,我们需要先找到那个函数,然后再找相应的变量去引用。然而,在这个过程中,我们需要通过一个临时变量来保存引用。具体操作如下:

注意:我们在这里使用了临时变量来保存引用。

下面是一个简单的示例程序:

上面这段代码可以很好地展示出如何使用临时变量保存引用。如果大家不想自己手动去写函数,也可以使用 python内置的函数库—— tuple ()去调用,下面是一个简单的例子:

1. 计算阶乘

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

2. 斐波那契数列

def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)

3. 汉诺塔

def hanoi(n, A, B, C):
if n == 1:
print(A, "->", C)
else:
hanoi(n-1, A, C, B)
print(A, "->", C)
hanoi(n-1, B, A, C)

4. 二分查找

def binary_search(arr, target, low, high):
if low > high:
return -1
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] > target:
return binary_search(arr, target, low, mid-1)
else:
return binary_search(arr, target, mid+1, high)

 


http://chatgpt.dhexx.cn/article/fPaBqKs5.shtml

相关文章

Python 递归的优化

文章目录 前言一、递归实现斐波那契二、优化后的斐波那契总结 前言 递归,很常见的一种算法,在初学的时候我们都会用递归来解决斐波那契数列,但递归本身有非常大的缺陷,就是时间和空间占用都非常大,在进阶学习后&#…

Python 递归实现乘法

Python定义函数:使用递归求乘积(x*y) 1 当作x个y相加或者y个x相加 2 当其中一数(以x为例)不为1时,返回y加上该函数,同时每次x-1,直至x1为止,此过程实现了x个y相加 具体代码如下:

python递归遍历查询文件 文件夹

文章目录 🍗先看运行效果🍔 具体思路🍟 一、主要使用的模块以及方法🌭 二、主要思路以及代码🍿 1、开始位置🧂 2、关键位置🥓 3、结果输出 🧇 完整源码🥞 结尾&#x1f9…

轻松搞懂Python递归函数的原理与应用

递归: 在函数的定义中,函数内部的语句调用函数本身。 1、递归的原理 学习任何计算机语言过程中,“递归”一直是所有人心中的疼。不知你是否听过这个冷笑话:“一个面包,走着走着饿了,于是就把自己吃了”。 常理推断&…

python递归如何理解

最近在做递归一些相关的东西,发现递归入门很容易,但要具体了解其实现过程,比较难以理解,在这里将自己这几天的摸索记录一下,写知乎的主要目的是为了给自己做笔记,在做笔记的同时,帮助后来人少走…

【Python函数的递归】

递归的定义 函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归在数学和计算机应用上非常强大…

H3C 交换机S5130S软件版本升级

1.通过官网下载软件包 升级的包名为 S5130S_HI-CMW710-R6330.ipe 2. 查看FLASH空间是否足够 <H3C>dir /all Free的空间需要是软件包的2倍大小&#xff0c;例如S5130S_HI-CMW710-R6330.ipe软件包大小为54MB&#xff0c;那么交换机Free的空间需要108M。 空间如果…

H3C 交换机S6520X软件版本升级

1.通过官网下载软件包 升级的包名为 S6520X-CMW710-R6312P02.zip 压缩包里有很多特性包&#xff0c;我们目前就使用 S6520X-CMW710-R6312P02.ipe 2. 查看FLASH空间是否足够 <H3C>dir /all Free的空间需要是软件包的2倍大小&#xff0c;例如S6520X-CMW710-R6312P0…

H3c服务器升级硬盘固件,H3C交换机升级固件版本

二、进入产品支持与服务&#xff0c;找到适配的交换机固件进行下载 三、下载时要求提供用户名密码 用户名&#xff1a;yx800 密码&#xff1a;01230123 四、H3C官方升级说明案例 1.1 实验拓扑(假设SW1上 VLAN 1 的虚地址为10.10.10.1&#xff0c;PC配置同网段地址10.10.10.…

博途V16 更改PLC的型号和固件版本

在线访问&#xff0c;查看硬件PLC的固件版本。 右键&#xff0c;选择更改设备。 选择PLC型号和版本号。

TIA博途_如何更新程序中的指令版本和CPU固件版本?

TIA博途_如何更新程序中的指令版本和CPU固件版本? TIA博途STEP7从V14SP1版本增加新功能:“更新程序”,可以将当前CPU中的程序版本更新至能够使用的最高版本,对于通讯、运动控制等版本经常升级的程序非常适用, 以下进行举例说明: TIA博途STEP7 V13 SP1中组态S7-1200 V4.1版…

TIA PORTAL西门子PLC的CPU固件版本兼容问题

TIA PORTAL西门子PLC的CPU固件版本兼容问题 以S7-1200为例&#xff0c;现在新出的PLC的固件都是V4.4的版本了&#xff0c;而原来的软件如V15.0组态不到V4.4&#xff0c;只能组态到V4.2&#xff0c;在想继续使用V15.0的情况下&#xff0c;这个PLC还可以用吗&#xff1f; 答案是可…

如何在TIA博途中在线更新PLC的CPU固件版本?

如何在TIA博途中在线更新PLC的CPU固件版本? S7-1200PLC最新的V4.6.0版本的固件出来了,本次就以V4.6版本的固件为例,演示如何在博途中对PLC的固件版本进行更新。 (为防止更新过程中出现意外,强烈建议对PLC的程序进行备份!备份!备份!) 如下图所示,打开某个项目,选中PL…

西门子S7-1200如何使用TIA软件更新CPU固件版本

1、先点击上方“可访问的设备”按钮&#xff0c;扫描出当前所连PLC。 2、点击“显示”&#xff0c;在右边目录树中即可显示出所连PLC&#xff0c;点击“在线和诊断”。 3、即可显示出固件版本和上一个使用者所用博图软件版本。 4、打开所连接S7-1200的“在线和诊断”视图&…

软件版本控制流程

1.编写目的 主要针对软件版本的流程, 以确保公司资产得到保护。 2.适用范围 该流程适用于产品研发部门。 3.环境资源 在整个产品生命周期中&#xff0c;以gitlab作为公司主要代码仓库。 4.流程 流程分为版本号定义、版本发布 4.1 版本号定义 4.1.1 版本号规则 采用语义…

康耐视智能相机更新固件版本方式

康耐视智能相机更新固件版本方式 1、 首先下载对应版本的in-sight Explorer软件&#xff0c;软件自带此版本的固件信息 2、 打开软件&#xff0c;将相机与电脑处于同一网段&#xff0c;在系统—将传感器/设备添加到网络 3、 设置好相机的IP 地址 4、 确认相机与电脑在同一网…

keil中查看仿真器固件版本号

1.首先选择仿真器类型 2.然后点击设置&#xff0c;FW Version显示的就是版本号。

如何确定当前的S7-1200PLC使用的具体的博途软件和固件版本?

如何确定当前的S7-1200PLC使用的具体的博途软件和固件版本? 首先,我们要了解,在使用博途软件对S7-1200或1500系列的PLC进行上传或下载等操作时,必须保持软件版本或固件版本的一致性,否则可能会出现意想不到的问题。 那么,如果当前正在使用的PLC或项目程序不是自己做的,…

软考高项笔记 | PERT 三点估算

PERT 三点估算&#xff1a; 期望时间&#xff1a;期望的一个工期&#xff0c;用 T 表示 悲观时间&#xff1a;最糟糕的情况&#xff0c;用 T1 表示 最可能时间&#xff1a;一般的情况&#xff0c;用 T2 表示 乐观时间&#xff1a;最好的情况&#xff0c;用 T3 表示 T &am…