Bio-Info 每日一题:Rosalind-04-Rabbits and Recurrence Relations

news2025/1/11 19:58:32

🎉 进入生物信息学的世界,与Rosalind一起探索吧!🧬
Rosalind是一个在线平台,专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战,帮助用户从基础到高级掌握生物信息学知识。无论你是初学者还是专业人士,Rosalind都能为你提供适合的学习资源和实践机会。网址:https://rosalind.info
你是否想像专业人士一样分析DNA序列?这里有一个简单的任务来帮助你入门。
📝 任务说明:
请添加图片描述

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”。其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
假设每对兔子生育时只生下一对小兔子,生下的小兔子用一个月时间成熟,在生下来的第二个月长成大兔子,在第三个月又能够生一对小兔子。如此循环往复,且在这个过程中所有兔子不会死。
以上是简化的斐波那契数列,根据给出的求和公式我们可以较为轻松地写出代码:

def fibonacci_digui(month):
    if month == 1 or month == 2:
        return 1
    else:

        return fibonacci_digui(month - 1) + fibonacci_digui(month - 2)
# 迭代
def fibonacci_diedai(month):
    a, b = 0, 1
    for _ in range(month-1):
        a, b = b, a + b
    return b

但是在这个问题中,给了两个参数 nkn 代表月份数,k 代表每对兔子每次生下的小兔子对数(k≤5)。要求计算在 n(n≤40)月之后的兔子对数。。

示例:

请添加图片描述

我们可以简单分析一下:第一个月是1对,第二月也是1对,第三个月是3对,第四个月是7对,第五个月是19对。为了方便表示后面我们就用 F(n) 表示对应月份的兔子数量。可以将兔子分成老兔子和新兔子,其中老兔子数量是上个月的数量,新兔子是成熟的兔子生的。

F(1)=1
F(2)=1
F(3)=1+(1*3)=F(2)+F(1)*3
F(4)=1*3+3=F(3)+F(2)*3
......
这样我们又能推导出一个公式,以此为依据写代码会方便不少

这样我们就能推导出一个公式,以此为依据写代码会方便不少。
因为兔子需要一个月的时间长大,所以这个月的兔子数量等于上个月数量加上 k 倍的前个月数量(前个月的兔子这个月可以生)。
请添加图片描述

解答:

def rabbit_born_digui(month, produce):
    if month == 1 or month == 2:
        return 1
    else:
        return (rabbit_born_digui(month - 1, produce)) + (
            rabbit_born_digui(month - 2, produce) * produce
        )

def rabbit_born_diedai(month, produce):
    a, b = 0, 1
    for _ in range(month - 1):
        a, b = b * produce, a + b
    return b

同时对于递归和迭代两种方法,迭代会更快,我们通过下面一段代码进行检验:

import time
def rabbit_born_digui(month, produce):
    if month == 1 or month == 2:
        return 1
    else:
        return (
            rabbit_born_digui(month - 1, produce)
            + rabbit_born_digui(month - 2, produce) * produce
        )

def rabbit_born_diedai(month, produce):
    a, b = 1, 1
    for _ in range(month - 2):
        a, b = b, a * produce + b
    return b

def main():
    month = 30  # 可以调整这个值来测试较大的 month
    produce = 3
    # 测试递归实现的运行时间
    start_time = time.time()
    result_recursive = rabbit_born_digui(month, produce)
    end_time = time.time()
    print(
        f"递归实现:第{month}个月后共有 {result_recursive} 对兔子,运行时间:{end_time - start_time:.5f} 秒"
    )
    # 测试迭代实现的运行时间
    start_time = time.time()
    result_iterative = rabbit_born_diedai(month, produce)
    end_time = time.time()
    print(
        f"迭代实现:第{month}个月后共有 {result_iterative} 对兔子,运行时间:{end_time - start_time:.5f} 秒"
    )

if __name__ == "__main__":

    main()

在这里插入图片描述
请添加图片描述

题外话

让GPT帮忙改了改代码,用记忆化递归和动态规划两种方法实现,之前的递归方法当月份设置到七八十的时候就已经很吃力了,结果这两种方法依旧是丝滑运行。

import time
def rabbit_born_digui_memo(month, produce, memo=None):
    if memo is None:
        memo = {}
    if month in memo:
        return memo[month]
    if month == 1 or month == 2:
        result = 1
    else:
        result = rabbit_born_digui_memo(month - 1, produce, memo) + rabbit_born_digui_memo(month - 2, produce, memo) * produce
    memo[month] = result
    return result
  
def rabbit_born_diedai(month, produce):
    if month == 1 or month == 2:
        return 1
    dp = [0] * (month + 1)
    dp[1], dp[2] = 1, 1
    for i in range(3, month + 1):
        dp[i] = dp[i - 1] + dp[i - 2] * produce
    return dp[month]

def main():
    month = 78  # 可以调整这个值来测试较大的 month
    produce = 3
    # 测试记忆化递归实现的运行时间
    start_time = time.time()
    result_recursive_memo = rabbit_born_digui_memo(month, produce)
    end_time = time.time()
    print(f"记忆化递归实现:第{month}个月后共有 {result_recursive_memo} 对兔子,运行时间:{end_time - start_time:.5f} 秒")

    # 测试动态规划实现的运行时间
    start_time = time.time()
    result_iterative = rabbit_born_diedai(month, produce)
    end_time = time.time()
    print(f"动态规划实现:第{month}个月后共有 {result_iterative} 对兔子,运行时间:{end_time - start_time:.5f} 秒")

if __name__ == "__main__":

    main()

在这里插入图片描述

加入Rosalind,开始你的生物信息学探索之旅吧!
纸上得来终觉浅,绝知此事要躬行。
公众号:BIoYfan,之后会坚持同步更新生信方面内容
与君共勉💪

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

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

相关文章

八、C语言:操作符详解

一、移位操作符 1.1左移操作 左边丢弃,右边补0 1.2右移操作 算数右移:右边丢弃,左边补原符号位 逻辑右移:右边丢弃,左边补0 int main() {int a -1;int b a >> 1;printf("b%d\n",b);return 0; } 原码…

Science刊发!乌普萨拉大学最新神经形态触觉人造皮肤可快速精准识别物体

当前,人形机器人使用的传统电子皮肤在处理触觉感知信息方面的能力并不强,尤其是在时间信息编码和快速特征提取方面存在一定的局限性。简单来说就是机器人无法完成在接触到物品的瞬间,判断用怎样的力度去对该物品做出反应。尽管多模态大模型和…

解决Android Studio Iguana版本不显示原创的GradleTask问题

问题描述: 下面是我的AndroidStudio版本号,升级后我发现项目里面自定义的gradletask找不到了??? 解决方案: 1、去setting里面把下面红框里面的选项勾选一下,缺点就是sync的时候会慢一些。 2、…

电子电气架构——车载诊断DTC一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

【python】OpenCV GUI——Mouse(14.1)

参考学习来自 文章目录 背景知识cv2.setMouseCallback 介绍小试牛刀 背景知识 GUI(Graphical User Interface,图形用户界面) 是一种允许用户通过图形元素(如窗口、图标、菜单和按钮)与电子设备进行交互的界面。与传统…

算法—字符串操作

394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string longestCommonPrefix(vector<string>& strs) { string retstrs[0];//***1***记得先要初始化ret&#xff0c;作为第一个比较值for(int i0;i<strs.size();i){retfoundcom…

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …

人体感应提醒 大声公+微波模块

文章目录 模块简介接线程序示例 模块简介 微波感应开关模块 RCWL-0516是一款采用多普勒雷达技术&#xff0c;专门检测物体移动的微波感应模块。采用 2.7G 微波信号检测&#xff0c;该模块具有灵敏度高&#xff0c;感应距离远&#xff0c;可靠性强&#xff0c;感应角度大&#…

DOM型xss靶场实验

DOM型xss可以使用js去控制标签中的内容。 我使用的是一个在线的dom型xss平台&#xff0c;靶场链接&#xff1a;Challenges 第一关Ma Spaghet!&#xff1a; Ma Spaghet! 关卡 <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(locatio…

【QT5】<应用> 小游戏:贪吃蛇

文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现&#xff1a;游戏界面存在一条蛇&#x1f40d;&#xff0c;使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物&#xff0c;蛇可以吃食物&#xff0c;然后…

结构体(1)<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…

LeetCode714买卖股票的最佳时机含手续费

题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手续费。如果你已经购买了一个股票&#xff0c;在卖出它之前你就不能再继续购买…

鸿蒙北向开发 IDE DevEco Studio 3.1 傻瓜式安装闭坑指南

首先下载 安装IDE 本体程序 DevEco Studio 下载链接 当前最新版本是3.1.1,下载windows版本的 下载下来后是一个压缩包, 解压解锁包后会出现一个exe安装程序 双击运行安装程序 一路 next ( 这里涉及安装文件目录,我因为C盘够大所以全部默认了,各位根据自己情况选择自己的文件…

物证管理系统|DW-S404实现物证科学化管理

随着社会的进步和科技的发展&#xff0c;信息化和数字化已经成为各个行业的必然趋势。在众多领域中&#xff0c;物证管理系统逐渐受到广泛的关注和应用。 物证是公安机关处理案件的关键凭证&#xff0c;针对过去物证管理分散、损毁遗失等严重问题&#xff0c;集驰电子JIONCH推…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行实例分割

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 EISeg 工具进行标注&#xff0c;然后使用 eiseg2yolov8 脚本将.json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容如下…

数字校园的优势有哪些

数字化时代下&#xff0c;数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造&#xff0c;提供全新的教学、管理和服务方式。那么&#xff0c;数字校园究竟具备何种优势&#xff1f;现从三个方面为您详细介绍。 首先&#xff0c;数字校园为教…

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树&#xff0c;只是在其基础上增加了平衡的要求&#xff0c;也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

使用树莓派和 L298N 来 DIY 小车底盘

树莓派小车可以作为 STEM&#xff08;科学、技术、工程、数学&#xff09;教育的工具&#xff0c;在实际操作中帮助学生理解和学习电子技术、编程和机器人原理。可以培养学生的动手能力、解决问题的能力和创新思维。 随着近年 AI 技术的高速发展&#xff0c;SLAM、VSLAM 甚至带…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

STM32关于uc/OS-III的多任务程序

目录 一、UCOS-III源码获取 二、HAL库工程的建立 1.RCC配置 2.SYS配置 3.USART1配置 4.GPIO配置 5.时钟配置 6.项目配置 三、KEil文件添加 1.文件复制 2.KEil工程添加 3.添加文件路径 四、代码修改 1. 2.修改文件app_cfg.h中代码 3.修改include.h的代码 4.修改…