【Python函数的递归】

article/2025/10/25 3:51:56

递归的定义

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

以求阶乘为例

#计算阶乘:根据用户输入的整数n,计算并输出n的阶乘值。
def fact(n):#计算阶乘if n == 0:return 1else:return n * fact(n-1)num = eval(input("请输入一个正整数: "))
print(fact(num))

递归函数调用过程 

递归的思想

把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。

递归的使用方法

  1. 找到递归关系,即把一个复杂的问题转化为与它形式相似、但规模较小的问题
  2. 找到递归出口,即问题转化时,当规模足够小,可以直接求解

递归法练习

1.字符串反转      

对于用户输入的字符串s,输出反转后的字符串。解决这个问题的基本思想是把字符串看作一个递归对象。    

def rev(s):  # 反转字符串if len(s) == 1:return selse:return s[-1]+rev(s[:len(s)-1])s = input()
print(rev(s))


2.斐波那契数列(1、1、2、3、5、8、13、21、34、……)

兔子繁殖问题:

在700多年前,意大利著名数学家斐波那契在《算盘全集》中提到这样一个问题:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,第n个月有多少对兔子?

F(1)=1

F(2)=1

F(3)=F(1)+F(2)=1+1=2

F(4)=F(2)+F(3)

…………

F(N)=F(N-2)+F(N-1)

代码

def fab(n):if n <= 2:return 1else:return fab(n-1)+fab(n-2)n = eval(input())
print(fab(n))

 斐波那契的递归实现版本里面有很多冗余计算,可以通过增加缓存来优化。

# -*- coding: UTF-8 -*-
# 斐波那契数列 递归
def fibonacci_inner(n, cache):if n == 1 or n == 2:return 1r = 0# 实现缓存if cache.get(n) is not None:return cache[n]else:cache[n] = fibonacci_inner(n-1, cache) + fibonacci_inner(n-2, cache)return cache[n]def fibonacci(n):return fibonacci_inner(n, {})if __name__ == '__main__':n = eval(input())print(fibonacci(n))

3.赶鸭子问题

题目描述

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

分析

设经过的村子为n (n = 0,1,2,...,7),根据题目分析可知递归结束的出口: n = 7时,剩余鸭子数duck = 2;

分析递归体:从后向前推 n=7时 ,duck = 2, 由于每经过一个村子,卖去所赶鸭子的一半又一只,因此七个村子后剩余的鸭子数 duck[7]=duck[6]-(duck[6]/2+1)

反推duck[6] = (duck[7] + 1) * 2

最终递归体: (duck[n+1] + 1) * 2;

综上  

n=7   duck=2
0<=n<7  duck=(duck(n+1) + 1) * 2

代码

def duck(n):if n == 7:return 2else:return (duck(n+1)+1)*2print("鸭子的总数为:{}".format(duck(0)))
sum = duck(0)
for i in range(1, 8):print("第{}个村庄卖出{}只鸭子,剩余鸭子数为{}". format(i, sum-duck(i), duck(i)))sum = duck(i)

运行结果


4.角谷定理

题目描述

角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。

示例输入输出
示例122

11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

step=15

示例233

16 8 4 2 1 

step=5

问题分析

递归出口:当输入的数字为1时,则直接输出

递归体:当输入数据不为1时

  • 当数据为偶数:除以2,递归直到数据为1,输出
  • 当数据为奇数:乘3再加1,递归直至数据为1,输出
# 角谷定理
def jiaogu(step, n):if n == 1:return stepelse:if n % 2 == 0:step += 1print("{:.0f}".format(n/2), end=" ")return jiaogu(step, n/2)else:step += 1print("{:.0f}".format(n*3+1), end=" ")return jiaogu(step, n*3+1)n = eval(input())
m = jiaogu(0, n)
print("\n需要经过{}次运算".format(m))

5.分橘子问题

题目描述

日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?

分析:

老大得到老六分给的桔子后,每个人的桔子总数为总数的平均即2520/6=420个

针对老大所得桔子数 = (420 - 从老六那里所得桔子数)*8/7, 老六分给老大其1/3之后剩余420个,因此他有420*3/2 = 630个桔子,即分给老大210个

则可以算出老大在得到老六桔子之前有420-210 = 210个由于老大将其1/8分给老二,则可算出老大最初拥有240个桔子

......

代码

'''
n  表示第几个儿子
beforenum  表示分配之前的橘子数
afternum  表示分配之后的橘子数
m  表示分配的比例
'''def orange(n, beforenum, afternum, m):if n > 6:return 0else:print("老" + str(n) + "原有橘子数" + str(beforenum) + "个")# 分给下一个人的橘子数givenum = afternum / m# 下一个人的橘子数nextbeforenum = 420 * (m - 1) / (m - 2) - givenum# 下一人加上之前的橘子数的总数aftergetnum = nextbeforenum + givenumreturn orange(n + 1, nextbeforenum, aftergetnum, m - 1)orange(1, 240, 240, 8)

运行结果



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

相关文章

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…

PMP考试【6】三点估算法 PERT计划评审技术

三点估算也称PERT法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff0c;计算最悲观的工 期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是 期望工期. 用PERT法计算工期&#xff0c;我们必须记住下面三个公式…

软考_2021年11月真题2__三点估算技术

33. 下图表示某项目各个活动关系及乐观、 最可能、 最悲观完成时间&#xff0c;假设各活动的三种完成时间服从分布&#xff0c; 按照三点估算法该项目标准差为 3.2 天&#xff0c;则项目在 ( )完成的概率为 95%。 活动紧前活动乐观时间&#xff08;天&#xff09;最可能…

三点估算工期

三点估算也称PERT法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff0c;计算最悲观的工期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是期望工期. 用PERT法计算工期&#xff0c;我们必须记住下面三个公式(P…

对项目工时的估算: PERT(计划评审技术) 三点估算法

“三点估算法”也称“PERT”法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff1a;计算最悲观的工期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是期望工期。 用PERT法计算工期&#xff0c;我们必须记…

软件项目管理 6.6.三点估算法

【公众号 “项目管理研究所” 将会第一时间更新文章并分享《行业分析报告》】 归档于软件项目管理初级学习路线 第六章 软件项目成本计划 《初级学习路线合集 》 前言 大家好&#xff0c;这节我们学习软件项目管理—三点估算法。 三点估算法 三点估算法是基于任务成本的三种…