python实验一 简单的递归应用

news2024/11/23 10:07:45

实验一

实验题目

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)

【代码】

def fib(months):
  if months == 0:
    return 0
  elif months == 1:
    return 1
  else:
    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。

【代码】

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

【代码】

import math

def fib_F1(n):

  phi = (1 + math.sqrt(5)) / 2

return round((phi ** n - (-phi) ** (-n)) / math.sqrt(5))

 

def fib_fei(n):

  if n <= 0:raise ValueError("输入值错误")

  if n == 1 or n == 2:return 1

  a, b = 1, 1

  for _ in range(3, n + 1):

​    a, b = b, a + b

return b

 

def 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() == "否":break

main()

【实例】

在这里插入图片描述

在这里插入图片描述

(5)

递归方法的优点:

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

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

非递归方法的优点:

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

非递归方法的缺点:

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

并且不太直观。

Fibonacci 通项公式方法的优点:

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

Fibonacci 通项公式方法的缺点:

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

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

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

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

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

【代码】

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_lst

  return lst

def eN(lst):

  sum_inverse = 0

  for i in lst:if i % 2 == 0:

​      sum_inverse += 1 / i

  return sum_inverse

def odd(lst):

  sum_inverse = 0

  for i in lst:if i % 2 != 0:

​      sum_inverse += 1 / i

  return sum_inverse

def 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)continue

main()

【实例】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 应用闪退、崩溃异常日志捕获插件(可对接网络上报)插件 Ba-Crash

应用闪退、崩溃异常日志捕获插件&#xff08;可对接网络上报&#xff09; Ba-Crash 简介&#xff08;下载地址&#xff09; Ba-Crash 是一款uniapp应用闪退、崩溃异常日志捕获插件&#xff0c;支持对接网络上报、设置提示等等&#xff0c;方便对一些远程问题、原生问题进行分…

【云原生】Docker 实践(五):搭建私有镜像 Harbor

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

基于node.js+css+html+mysql博客系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

C#描述-计算机视觉OpenCV(4):图像分割

C#描述-计算机视觉OpenCV&#xff08;4&#xff09;&#xff1a;图像分割 前言用 GrabCut 算法分割图像实例展示 前言 本文中如果有什么没说明的地方&#xff0c;大概率在前文中描述过了。 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算…

第十五届蓝桥杯省赛大学B组(c++)

很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦... 这篇文章主要对第十五届省赛大学B组(C)进行一次完整的复盘,这次省赛2道填空题6道编程题: A.握手问题 把握手情景看成矩阵: 粉色部分是7个不能互相捂手的情况 由于每个人只能和其他人捂手, 所以黑色情况是不算的 1和2握手2和…

快速掌握Element-Ul,构建高效网页应用【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

JavaScript继承的方法和优缺点

原型链继承 让一个构造函数的原型是另一个类型的实例&#xff0c;那么这个构造函数new出来的实例就具有该实例的属性。 优点&#xff1a; 写法方便简洁&#xff0c;容易理解。 缺点&#xff1a; 在父类型构造函数中定义的引用类型值的实例属性&#xff0c;会在子类型原型上…

逻辑回归实战 -- 是否通过考试

http://链接: https://pan.baidu.com/s/1-uy-69rkc4WjMpPj6iRDDw 提取码: e69y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 数据集下载链接 这是个二分类问题&#xff0c;通过x1,x2两个指标得出是否通过考试的结论。 逻辑回归的激活函数是sigmoid函数&…

STM32单片机实战开发笔记-EXIT外部中断检测

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab EXIT模块测试 功能描述 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型&a…

P9422 [蓝桥杯 2023 国 B] 合并数列

P9422 [蓝桥杯 2023 国 B] 合并数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 用队列即可 当两个队列队首&#xff1a;a b &#xff0c;弹出 当a < b&#xff0c;把a加给其后一个元素&#xff0c;弹出a 当b < a&#xff0c;把b加给其后一个元素&#xff0c;弹出…

Eclipse 开创性地集成 Neon Stack,将 EVM 兼容性带到 SVM 网络

2024年5月2日&#xff0c;全球——在塑造区块链网络的战略联盟的过程中&#xff0c;Eclipse 通过集成 Neon EVM 核心团队开发的技术堆栈 Neon Stack&#xff0c;成为首个打破 EVM-SVM 兼容性障碍的生态。 Eclipse 旨在通过结合以太坊和 Solana 的最佳特性&#xff0c;来重构区…

2024年钉钉群直播回放如何永久保存

工具我已经打包好了&#xff0c;有需要的自己取一下 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再把逍遥一仙下载器压缩包也解压一下 3.打开逍遥一仙下载器文件夹里面的M3U8…

华为云耀云服务器开放端口

博客主页&#xff1a;花果山~程序猿-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一.华为云控制台开放端口 寻找到安全组信息 2. 添加开放的端口信息 3. 检查是否成…

常用AI工具分享 + IDEA内使用通义灵码

引言 随着人工智能技术的飞速发展&#xff0c;AI工具已经渗透到我们日常生活和工作的各个领域&#xff0c;带来了前所未有的便利。现在我将分享一下常用的AI工具&#xff0c;以及介绍如何在IDEA中使用通义灵码。 常用AI工具 1. 通义灵码 (TONGYI Lingma) - 由阿里云开发的智能…

STM32的TIM输入捕获和PWMI详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. IC输入捕获 2. 频率测量 3. 主模式、从模式、触发源选择 4. 输入捕获基本结构 5. PWMI模式 6. 代码示例 6.1 PWM.c 6.2 PWM.h 6.3 IC.c 6.4 IC.h 6.5 完整工程文件 输出比较可以看下面这篇…

Covalent Network(CQT)为 Arbitrum 生态提供 250 万美元的资助,以促进 Web3 的创新与发展

Covalent Network&#xff08;CQT&#xff09;作为 Web3 领先的“数据可用性”层&#xff0c;宣布将提供 250 万美元的资金以支持 Arbitrum 生态项目&#xff0c;包括 Arbitrum One、Nova、Orbit 或 Stylus。此举旨在通过提供资源和帮助&#xff0c;推动利用 Arbitrum 网络上 C…

华为机考入门python3--(20)牛客20- 密码验证合格程序

分类&#xff1a;字符串 知识点&#xff1a; 遍历字符串的每个字符 for char in my_str: 可以直接比较字符范围 a < char < z 列表统计元素个数 my_list.count(elem) 寻找子串 my_str.find(sub_str) 题目来自【牛客】 import re import sysdef check_…

信息泄露.

一&#xff0c;遍历目录 目录遍历&#xff1a;没有过滤目录相关的跳转符号&#xff08;例如&#xff1a;../&#xff09;&#xff0c;我们可以利用这个目录找到服务器中的每一个文件&#xff0c;也就是遍历。 tipe&#xff1a;依次点击文件就可以找到flag 二&#xff0c;phpi…

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts

这门课程专注于提示工程的掌握&#xff0c;教你以精确的方式引导GPT&#xff0c;利用它们的生成能力产生卓越的AI驱动结果。一步一步地&#xff0c;你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI&#xff0c;到以惊…

uniapp 监听APP切换前台、后台插件 Ba-Lifecycle

监听APP切换前台、后台 Ba-Lifecycle 简介&#xff08;下载地址&#xff09; Ba-Lifecycle 是一款uniapp监听APP切换前台、后台的插件&#xff0c;简单易用。 截图展示 也可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 在 script…