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 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。

【代码】

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 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为止,退出程序。

【代码】

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.mzph.cn/web/6374.shtml

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

相关文章

[每日AI·0501]GitHub 版 Devin,Transformer的强力挑战者 Mamba,Sora 制作细节与踩坑,OpenAI 记忆功能

AI 资讯 国资委&#xff1a;加快人工智能等新技术与制造全过程、全要素深度融合GitHub版 Devin 上线&#xff0c;会打字就能开发应用&#xff0c;微软 CEO&#xff1a;重新定义 IDE在12个视频理解任务中&#xff0c;Mamba 先打败了 TransformerSora 会颠覆电影制作吗&#xff…

Oracle 23c? No Oracle 23ai

昨天 Oracle 发布了最新的Oracle版本。出乎意料的是这个版本从Oracle 23c 更名为 Oracle 23ai &#xff0c;似乎预示着Oracle的掌舵人Larry也要全面拥抱AI技术浪潮了。 23ai版本主要功能介绍: Oracle Database 23ai 是 Oracle 数据库的下一个长期支持版本。它包括 300 多项新功…

【LeetCode刷题】410. 分割数组的最大值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 410. 分割数组的最大值 2. 题目描述 3. 解题方法 题目中提到的是某个和的最大值是最小的&#xff0c;这种题目是可以用二分来解决的。 确定区间&#xff0c;根据题目的数据范围&#xff0c;可以确定区间就是[0, 1e9]…

LEETCODE LCR 041. 数据流中的移动平均值

class MovingAverage:def __init__(self, size: int):"""Initialize your data structure here."""self.sizesize1self.front0self.rear0self.queue[None for _ in range(size1)]self.sum0def next(self, val: int) -> float:# 满了if (self.…

postman中百度preview无法加载的解决方案

问题 在使用postman关联时&#xff0c;百度接口与天气接口已使用glb_city关联&#xff0c;但在百度接口发送请求时&#xff0c;发现preview无法加载 解决方案 1、进入百度 百度全球领先的中文搜索引擎、致力于让网民更便捷地获取信息&#xff0c;找到所求。百度超过千亿的中…

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…

leetCode68. 文本左右对齐

基本思路&#xff1a; leetCode68. 文本左右对齐 代码 class Solution { public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> res;for(int i 0; i < words.size(); i){ // 枚举有多少个单词int j i 1; //…

MATLAB中自定义栅格数据地理坐标R,利用geotifwrite写入tif

场景描述&#xff1a; 有时候将nc格式的数据转成tiff&#xff0c;或者是将一个矩阵输出成带有地理坐标信息tiff数据时&#xff0c;常常涉及到空间参考的定义和geotiffwrite()函数。 问题描述&#xff1a; 以全球数据为例&#xff0c;今天发现在matlab中对矩阵进行显示后&…

苹果可能将OpenAI技术集成至iOS/iPadOS 18

&#x1f989; AI新闻 &#x1f680; 苹果可能将OpenAI技术集成至iOS/iPadOS 18 摘要&#xff1a;苹果正在与OpenAI就将GPT技术部署在iOS/iPadOS 18中进行谈判。这项技术被视为可能增强的Siri功能&#xff0c;即“AI聊天机器人”。除Siri外&#xff0c;新技术还可能改善Spotl…

IDEA2024版本控制台乱码怎么解决?

在使用最新版本的IDEA时&#xff0c;可能会遇到控制台输出乱码问题&#xff1f; 在网上找了很多办法&#xff0c;修改了IDEA的vmoptions文件也没有用,最后发现原来是要修改这里 Setting>>Build&#xff0c;Execution,Deployment>>Runnr中的VM Options配置&#xf…

# IDEA 复制项目 Module 出现 不同模块下的 Product 类报错

IDEA 复制项目 Module 出现 不同模块下的 Product 类报错 我们 用 IDEA 复制项目 Module 出现 不同模块下的 Product 类报错&#xff0c;发现复制的 module 名称没有改变或者 java 文件夹后面还有原项目 source root 字样&#xff0c;maven 父子项目没有标识等问题。 解决方法…

.360勒索病毒的威胁:如何恢复您的数据?

引言&#xff1a; 近年来&#xff0c;网络安全威胁层出不穷&#xff0c;其中.360勒索病毒以其独特的攻击方式和广泛的传播能力&#xff0c;成为了众多企业和个人面临的重大挑战。本文将对.360勒索病毒进行深入剖析&#xff0c;并探讨应对此类病毒的有效策略&#xff0c;以帮助…

web3风格的网页怎么设计?分享几个,找找感觉。

web3风格的网站是指基于区块链技术和去中心化理念的网站设计风格。这种设计风格强调开放性、透明性和用户自治&#xff0c;体现了Web3的核心价值观。 以下是一些常见的Web3风格网站设计元素&#xff1a; 去中心化标志&#xff1a;在网站的设计中使用去中心化的标志&#xff0…

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址&#xff1a;revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场&#xff0c;它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…

C语言——文件相关操作

2.什么是文件 3.文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 6.文本文件和二进制文件 7.文件读取结束的判定 8.文件缓冲区 一、文件相关介绍 1、为什么使用文件 文件用于永久存储数据。通过使用文件&#xff0c;我们可以在程序关闭后保存数据&#xff0c;以便将来…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

AI-数学-高中53-离散型随机变量的均值与方差

原作者视频&#xff1a;【随机变量】【一数辞典】3离散型随机变量的均值与方差_哔哩哔哩_bilibili 标准差 方差开根

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …

17、ESP32 SPI

SPI 概述 SPI&#xff08;Serial Peripheral Interface&#xff09;协议&#xff0c;即串行外围设备接口&#xff0c;采用一主多从的全双工通信总线。被广泛使用在要求通讯速率较高的场合。 SPI 通信需要四条信号线&#xff1a; MISO&#xff1a; 主器件数据输入&#xff0c;从…

基于SSM SpringBoot vue教务排课系统

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