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)

【代码】

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()

【实例】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件工程全过程性文档(软件全套文档整理)

软件项目相关全套精华资料包获取方式①&#xff1a;进主页。 获取方式②&#xff1a;本文末个人名片直接获取。 在软件开发的全过程中&#xff0c;文档是记录项目进展、决策、设计和测试结果的重要工具。以下是一个简要的软件全过程性文档梳理清单&#xff1a; 需求分析阶段…

基于 AI 的数据库助手-Chat2DB

序言 现在已经开始步入 AI 时代&#xff0c;AI 产品也已经络绎不绝。今天&#xff0c;给大家介绍一款数据库的 AI 产品 —— Chat2DB。 一、什么是 Chat2DB Chat2DB 由阿里提供的一个数据库管理、数据开发、数据分析的工具&#xff0c;它是一个 AI 原生的数据库管理工具&…

Spring 当中的Bean 作用域

Spring 当中的Bean 作用域 文章目录 Spring 当中的Bean 作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域&#xff0c;一个线程一个 Bean 2. 总结:3. 最后&#xff1a; 每…

JavaScript基础(三)

JS的数据类型 数据类型&#xff0b;解释 undefined 如var num;变量num没有初始值将被赋予undefined[基本数据类型]。 null 表示一个空值&#xff0c;与undefined值相等[对象]。 number 例:var num10; //整数&#xff0c;var num10.5; //浮点型。 boolean 布尔型&…

【linuxC语言】fcntl和ioctl函数

文章目录 前言一、功能介绍二、具体使用2.1 fcntl函数2.2 ioctl函数 三、拓展&#xff1a;填写arg总结 前言 在Linux系统编程中&#xff0c;经常会涉及到对文件描述符、套接字以及设备的控制操作。fcntl和ioctl函数就是用来进行这些控制操作的两个重要的系统调用。它们提供了对…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(一)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; Phpsploit-Framework&#xff08;简称 PSF&#xff09;框架软件&#xff0c;是一款什么样的软件呢&#xff1f; Phpspl…

[数据结构]———归并排序

具体代码&#xff1a;在gitee仓库&#xff1a;登录 - Gitee.com 目录 ​编辑 1.基本思想&#xff1a; 2. 代码解析 1.分析 2.逻辑图 3.运行结果 1.基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分…

Redis__三大日志

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__三大日志 ⏱️ 创作时间&#xff1a;2024年04月30日 ———————————————— 对于MySQL来说, 有…

C# WinForm —— 08 Form初始化、布局、注册事件

Form 初始化 Form初始化的时候会调用 Designer.cs 里的 InitializeComponent(); 函数&#xff0c;在InitializeComponent(); 函数里面有Load Form语句时会调用 FrmLogin_Load()函数 Form布局 两种方式&#xff1a; 拖控件到窗体&#xff0c;设置属性在Load事件中写代码添加…

Python梯度提升决策树库之lightgbm使用详解

概要 LightGBM是一个快速、分布式、高性能的梯度提升决策树(Gradient Boosting Decision Tree)库,它在机器学习和数据挖掘领域被广泛应用。本文将介绍LightGBM库的安装方法、主要特性、基本功能、高级功能、以及在实际应用中的场景和总结。 安装 首先,需要安装LightGBM库…

一文读懂:到底什么是SCDN?

最近大家一定经常听到CDN这个词&#xff0c;对于之前没接触过这个行业的人&#xff0c;可能会听的云里雾里&#xff0c;不明所以。 那到底什么是SCDN呢&#xff1f; 简单理解&#xff1a;SCDN数据快递前置仓&#xff1f; SCDN&#xff0c;全称 Secure Content Delivery Networ…

自测痉挛性斜颈的迹象:通过六个动作进行判断【北京仁爱堂】

痉挛性斜颈是一种肌张力障碍性疾病&#xff0c;其主要特征是颈部肌肉群的病理性收缩&#xff0c;导致头颈部姿势异常。为了更好地了解自身的颈部健康状况&#xff0c;我们可以通过以下六个动作进行自测&#xff0c;以判断是否存在痉挛性斜颈的迹象。 一、头颈阵挛性旋转首先&am…

2024网络安全面试问题宝典(4万字)

2024网络安全厂商面试问题宝典(4万字) 目录 评分标准网络基础问题 TCP建立连接要进行3次握手&#xff08;syn-syn&#xff0c;ack-ack&#xff09;&#xff0c;而断开连接要进行4次&#xff08;fin-ack-fin-ack&#xff09;TCP&#xff0c;UDP区别&#xff1a;安全常用的协议…

Jenkins(超详细的Docker安装Jenkins教程!!!)

Jenkins Jenkins&#xff0c;原名 Hudson&#xff0c;2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。 官方网站&#xff1a;https://www.jenkins.io/ 中文文档&#xff1a;https://www.jenkins.io/zh/ 为什么需要Jenkins&#xff1f; 我们以前写完代码&a…

抖音视频0粉营销推广墙纸,当日收益,第二天提现,日入300

项目简介&#xff1a; 这个项目非常易于执行&#xff0c;主要涉及在抖音平台上分享爱国主题的壁纸&#xff0c;并通过推广相关的小程序来实现盈利。 下 载 地 址 &#xff1a; laoa1.cn/1849.html 项目操作简便&#xff0c;一般只需花费1个小时即可完成&#xff0c;一旦掌…

JAVASCRIPT+PHP+GB2312字库文件实现浏览器LED滚动效果

一、效果 二、源码 1、test_led.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>MATRIX LED</title> <script src"https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script…

VSCode连接远程服务器时卡在审核(check)log.txt和pid.txt

诸神缄默不语-个人CSDN博文目录 VSCode就NM跟SB一样天天搁那儿更新&#xff0c;瞎JB更新&#xff0c;每次更新都要出一次兼容性问题&#xff0c;远程服务器不能连公网就上不去了&#xff0c;也没有显式提示&#xff0c;错误很明显就是在下载不了文件&#xff0c;用VSCode内置的…

Xamarin.Android项目使用ConstraintLayout约束布局

Xamarin.AndroidX.ConstraintLayout Xamarin.Android.Support.Constraint.Layout Xamarin.AndroidX.ConstraintLayout.Solver Xamarin.AndroidX.DataBinding.ViewBinding Xamarin.AndroidX.Legacy.Support.Core.UI Xamarin.AndroidX.Lifecycle.LiveData ![在这里插入图片描述]…

【软件工程】需求分析

目录 前言需求分析需求获取UML概述用例图用例图的组成用例图中的符号和含义包含的两种使用场景 用例图补充&#xff1a;“系统”用例模型建模确定系统参与者确定系统用例 用例文档用例文档组成部分 活动图组成元素初始节点和终点活动节点转换决策与分支、合并分岔与汇合 类图类…