python实验一 简单的递归应用

embedded/2024/9/20 7:14:05/ 标签: python, 开发语言, 算法, 数据结构, 链表

实验一

实验题目

1、兔子繁殖问题(Fibonacci’s Rabbits)。一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少只兔子。

在这里插入图片描述

(1)请列出兔子繁殖问题的递推公式;

(2)请写出兔子繁殖问题的递归结束的条件;

(3)请编写程序用递归方式实现对兔子繁殖问题的求解,计算输出每个月各有多少只兔子。

(1)

当n = 1时,F(1) = 1

当n = 2时,F(2) = 1

当n > 2时,F(n) = F(n-1) + F(n-2)

(2)

1.当月份n<=0时,递归结束:

n为负数,不存在负数个月份,程序不会运行;n为0,还未开始繁殖,兔子数量为0。(此时一般是输入错误)

2.当月份n1或n2,此时兔子数量为1对,停止繁殖。

(3)

【代码】

python">def fib(months):if months == 0:return 0elif months == 1:return 1else:return fib(months-1) + fib(months-2)n = int(input("请输入月份:"))
for i in range(n):rabbit = fib(i)print("第", i+1, "个月的兔子数量:", rabbit, "只")

在这里插入图片描述

在这里插入图片描述

2、编程解决如下问题:

(1)建立列表lst,由键盘输入该列表的n个成员,n的大小由录入者控制;

(2)利用匿名函数和filter函数过滤掉其中的偶数,并将奇数保留在列表lst1中;

(3)利用匿名函数和map函数,求出lst1中每一个成员的倒数,并将它们保存到列表lst2中;

(4)分别输出lst,lst1,lst2。

【代码】

python">n = int(input("input number:"))lst = []for i in range(n):member = int(input('input member:'))lst.append(member)lst1 = list(filter(lambda x: x % 2 == 1, lst))lst2 = list(map(lambda y: 1 / y, lst))print(lst)print(lst1)print(lst2)

【实例】

在这里插入图片描述

在这里插入图片描述

3、请分别用非递归方法和Fibonacci通项公式求出兔子繁殖问题(Fibonacci’s Rabbits)中第n个月小兔子的数量。要求如下:

(1) 列出Fibonacci通项公式

(2)编程实现题目中的两种算法

(3)在程序中,n由使用者输入,当为负数或0时,报异常,提示用户输入值错误,并允许用户重新输入,直到用户输入正确为止。

(4)此程序允许用户不间断使用,即计算完毕一次询问用户是否继续计算,用户输入“是”,则继续;输入“否”,则退出程序。

(5)将实验题目1中的方法与本题中两种方法进行比较,说出它们的优劣。

(1)

F n = ( φ n − ( 1 − φ ) n ) / √ 5 ( 2 ) Fn = (φ^n - (1-φ)^n) / √5(2) Fn=(φn(1φ)n)/√5(2)

φ (黄金分割率) = ( √ 5 + 1 ) / 2 ≈ 1.6180339887 φ (黄金分割率)= (√5 + 1) / 2 ≈ 1.6180339887 φ(黄金分割率)=(√5+1)/21.6180339887

【代码】

python">import mathdef fib_F1(n):phi = (1 + math.sqrt(5)) / 2return round((phi ** n - (-phi) ** (-n)) / math.sqrt(5))def fib_fei(n):if n <= 0:raise ValueError("输入值错误")if n == 1 or n == 2:return 1a, b = 1, 1for _ in range(3, n + 1):​    a, b = b, a + breturn bdef main():while True:try:​      n = int(input("请输入月份 n:"))if n <= 0:raise ValueError("输入值错误")except ValueError as e:print(e)continue​    result1 = fib_F1(n)​    result2 = fib_fei(n)print(f"使用 Fibonacci 通项公式计算结果:{result1}")print(f"使用非递归方法计算结果:{result2}")​    choice = input("是否继续计算?(是/否)")if choice.lower() == "否":breakmain()

【实例】

在这里插入图片描述

在这里插入图片描述

(5)

递归方法的优点:

代码简洁易懂,并且不需要额外的数学公式或复杂的迭代逻辑。

递归方法的缺点:会进行大量重复的计算,时间复杂度高;递归可能会导致栈溢出,特别是对于较大的输入值。

非递归方法的优点:

有较低的时间复杂度,避免了重复计算,计算更高效;并且通常只需要保存前两个斐波那契数的值,占用的内存较少。

非递归方法的缺点:

需要使用迭代或循环来计算斐波那契数,可能需要额外变量和逻辑,代码更复杂,

并且不太直观。

Fibonacci 通项公式方法的优点:

Fibonacci 通项公式直接计算第 n 个斐波那契数,不需要逐个相加或进行递归,有较低的时间复杂度;能够得到准确的结果,无需担心误差积累问题。

Fibonacci 通项公式方法的缺点:

公式中包含浮点数运算和开方运算,对于大规模的计算,可能会出现精度问题或计算时间较长;需要数学知识和公式推导,不太直观。

4、修改实验题目2的程序,要求如下:

(1)建立函数inputZ(n),完成lst的录入,录入时若lst<=0时,报异常,并允许用户重新录入数据,返回值为列表lst。

(2)建立函数eN(lst),完成偶数过滤,求每个成员的倒数,然后,将所有成员累加求和,并返回和。

(3)编写可以调用上述函数的应用函数,计算列表中每个奇数成员的倒数之和,此函数运行后,可供用户循环使用,直到输入n为止,退出程序。

【代码】

python">def inputZ(n, lst=None):if lst is None:​    lst = []temp_lst = []for i in range(n):while True:try:​        member = float(input(f"请输入第{i+1}个成员:"))if member <= 0:raise ValueError("输入值错误")​        temp_lst.append(member)breakexcept ValueError as e:print(e)lst += temp_lstreturn lstdef eN(lst):sum_inverse = 0for i in lst:if i % 2 == 0:​      sum_inverse += 1 / ireturn sum_inversedef odd(lst):sum_inverse = 0for i in lst:if i % 2 != 0:​      sum_inverse += 1 / ireturn sum_inversedef main():lst = []while True:try:print("请选择功能:")print("1. 录入列表")print("2. 完成偶数过滤,求每个偶数成员的倒数,并计算总和")print("3. 完成奇数过滤,求每个奇数成员的倒数,并计算总和")print("4. 退出程序")​      choice = input("请输入选择:")if choice == "1":​        n = int(input("请输入列表成员的个数:"))if n <= 0:raise ValueError("输入值错误")​        lst = inputZ(n, lst)print("列表成员:", lst)elif choice == "2":if not lst:print("请先录入列表")continue​        result = eN(lst)print("列表中每个偶数成员的倒数之和为:", result)elif choice == "3":if not lst:print("请先录入列表")continue​        result = odd(lst)print("列表中每个奇数成员的倒数之和为:", result)elif choice == "4":breakexcept ValueError as e:print(e)continuemain()

【实例】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/embedded/31502.html

相关文章

Ubuntu启动后进入GRUB故障-Minimal BASH like line editing is supported.

目录 1.问题描述 2.解决方案 2.1 临时性办法 2.2 工具永久性修复 总结 1.问题描述 PC安装Ubuntu系统第二天重启后提示GUN GRUB version 2.04&#xff0c;之前是WindowsOS装Ubuntu后无法进入图形界面。具体原因据网友提供线索据说是由于在Windows上进行更新/重装/修改了引…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口

C语言 | Leetcode C语言题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; char* getPermutation(int n, int k) {int factorial[n];factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;char* ans malloc(n 1);ans[n] \0;int valid[n 1];for (int i 0; i < n; i) {val…

拼多多怎么推广才有自然流量

在拼多多平台上获取自然流量&#xff0c;商家可以采取以下几种策略&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最…

49. 【Android教程】HTTP 使用详解

在你浏览互联网的时候&#xff0c;绝大多数的数据都是通过 HTTP 协议获取到的&#xff0c;也就是说如果你想要实现一个能上网的 App&#xff0c;那么就一定会和 HTTP 打上交道。当然 Android 发展到现在这么多年&#xff0c;已经有很多非常好用&#xff0c;功能非常完善的网络框…

算法--分治法

分治法是一种算法设计策略&#xff0c;它将一个复杂的问题分解成两个或多个相同或相似的子问题&#xff0c;直到这些子问题可以简单地直接解决。然后&#xff0c;这些子问题的解被合并以产生原始问题的解。 分治法通常遵循以下三个步骤&#xff1a; 分解&#xff1a;将原问题…

前端页面平滑过渡解决方案

一、问题产生 在使用图片作为页面背景时&#xff0c;无法使用transtion进行平滑过渡&#xff0c;直接切换背景又会降低使用体验。 二、解决方式 使用clip-path对背景图片裁剪配合transtion实现平滑过渡的效果 三、效果展示 网址&#xff1a;ljynet.com 四、实现方式 tem…

SQL LPAD函数使用

Oracle SQL 中的 LPAD 函数是一个用于格式化字符串的函数&#xff0c;它会在给定字符串的左侧填充指定的字符&#xff0c;直到字符串达到指定的长度。这个函数在数据库查询中非常有用&#xff0c;尤其是在需要对输出进行格式化时&#xff0c;比如在报表中。 LPAD 函数的语法 …

如何确定控制器的采样频率?

确定控制器的采样频率通常涉及到系统的要求、控制算法的稳定性以及硬件的性能等因素。在确定采样频率时&#xff0c;需要平衡这些因素&#xff0c;以确保系统的稳定性和性能。 在LabVIEW中进行分析时&#xff0c;可以按照以下步骤进行&#xff1a; 确定系统要求&#xff1a;首…

古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

XYCTF2024 RE ez unity 复现

dll依然有加壳 但是这次global-metadata.dat也加密了&#xff0c;原工具没办法用了&#xff0c;不过依然是可以修复的 a. 法一&#xff1a;frida-il2cpp-bridge 可以用frida-il2cpp-bridge GitHub - vfsfitvnm/frida-il2cpp-bridge: A Frida module to dump, trace or hijac…

css实现瀑布流布局

瀑布流布局也可以通过纯CSS来实现&#xff0c;使用CSS的column属性可以实现多列布局。下面是一个使用纯CSS实现瀑布流布局的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"…

Opecv-Python常用算子库(总结)

文章目录 1 常用算子梗概2 实际项目中的总结 1 常用算子梗概 1.1 读取图像 cv2.imread(filename, flags) 1.2 显示图像 cv2.imshow(winname, mat) 1.3 保存图像 cv2.imwrite(filename, mat) 1.4 改变图像大小 cv2.resize(src, dsize, dstNone, fxNone, fyNone, interpolationN…

旅游新策略,共享与补贴助力地方经济繁荣

在当前的经济环境中&#xff0c;旅游业对于地方经济增长的重要性日益凸显。各个城市都在积极探索增加旅游流量的方法&#xff0c;以刺激本地经济的增长。 例如&#xff0c;淄博政府通过政策推动和合作模式&#xff0c;成功吸引了大量游客&#xff0c;这成为了一个成功的案例。…

商业银行终端安全管理创新与实践

文章目录 前言一、终端使用和管理现状二、终端面临的安全风险1、传统的终端安全工具无法有效识别新型威胁2、黑客攻击的目标重心瞄向终端三、终端安全防护技术的探索和实践1、远程办公场景首次尝试基于威胁情报技术的木马防护措施,取得良好成效2、自研终端数字化管控系统,提升…

openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引

文章目录 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引274.1 现象描述274.2 优化分析 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引 274.1 现象描述 查询与销售部所有员工的信息&#xff1a; SELECT staff_id,first_…

1-37 文件 与流

一 文件 1.含义:真正存储数据的载体 2.分类:(掌握) 存储关系分类 文件 -- 可以直接操作的数据资源的载体 文件夹 -- 同时存放一个或多个文件的"容器" 存储数据资源的类型分 (重点) 文本文件 -- 纯文本 : 操作都是字符型数据 例 .java / .txt / .class ... 媒体文件…

2024-4-28

今日流水账&#xff1a; 上午&#xff1a; 打CTF总不能爆零吧&#xff0c;所以看群里师傅说 D3CTF 的那道 qemu 逃逸很简单&#xff0c;所以就把他给做了然后还是在配内核环境&#xff0c;服了&#xff0c;还是不行捏~~~下午继续配&#xff0c;啊啊啊 好好的思考了一下&#xf…

Word文件后缀

Word文件后缀 .docx文件为Microsoft Word文档后缀名&#xff0c;基于XML文件格式 .dotm为Word启用了宏的模板 .dotx为Word模板 .doc为Word97-2003文档&#xff0c;二进制文件格式 参考链接 Word、Excel 和 PowerPoint 的文件格式参考 Learn Microsoft

基于SSM SpringBoot vue教务排课系统

基于SSM SpringBoot vue教务排课系统 系统功能 登录 个人中心 学生信息管理 教师信息管理 课室信息管理 班级信息管理 系别信息管理 专业信息管理 课程信息管理 选课信息管理 课表信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Myba…