澳大利亚兔灾和——栈?

news2024/12/24 8:39:24

一.背景 

       1859年,当一位叫托马斯·奥斯汀的农民收到英国老家送来的24只野兔并将它们放归农场的时候,他绝对意想不到,这些看似人畜无害的小兔子,竟为古老的澳洲大陆带来一场巨大的生态破坏。到20世纪初,澳大利亚的兔子数量已经多到了灾难的程度。它们与本土动物争夺栖息地,造成了小型有袋动物的大量减少。它们环剥树皮,啃食庄稼,密集的兔洞穿空土地带来严重的水土流失。兔子们以每年80英里的速度在澳大利亚境内迁徙,从最初的落脚地维多利亚,进入新南威尔士、南澳大利亚、昆士兰,直至西澳大利亚。时至今日,依然有2亿至3亿只欧洲野兔生活在澳大利亚。

二.斐波那契数列

       如果说,兔子在出生两个月之后,就拥有繁殖能力,一对兔子每个月能生出一对小兔子来,假设所有兔子都不死,那么一年之后可以繁殖多少对兔子呢?

       我们拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔子数共有两对;三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对……依次类推可以列出下表:

所经过的月数123456789101112
兔子对数1123581321345589144

 

表中数字1,1,2,3,5,8......构成了一个序列.这个这个数列有个十分明显的特点,那是:前面相邻两项之和,构成了后一项.

 

我们用数学函数来定义就是:

 

 用代码怎么实现呢?

int Fbi(int n)
{
	if(n==1||n==2)//通过数列的规律发现,前两项都为1,作为递归的终止条件
	{
		return 1;
	}
	else
	{
		return Fbi(n-1)+Fbi(n-2);//要求第n项,就是求n-1项和n-2项的和
	}
}
int main()
{
	int i,n;
	printf("请输入你要打印的斐波那契数列项数:\n");
	scanf("%d",&n);//n为打印的项数
	printf("斐波那契数列:");
	for(i=1;i<=n;i++)
	{
		printf("%d ",Fbi(i));//fun函数返回的是第i项,所以用for循环打印每一项
	}
	return 0;
}

我们来模拟代码中Fbi(i)函数中 i=5的执行过程,如图所示:

 三.递归

       在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。
       当然,写递归程序最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。比如刚才的例子,总有一次递归会使得i<2的,这样就可以执行return i的语句而不用继续递归了。
       大量的递归调用会建立函数的副本,会耗费大量的时间和内存。

四.栈

        那么我们所讲的递归,和栈有什么关系呢?这得从计算机系统的内部说起。


        前面我们已经看到递归是如何执行它的前行和退回阶段的。递归过程退回的顺序是它前行顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过程中存储起来的某些数据。
这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构
,因此,编译器使用栈实现递归就没什么好惊讶的了。
        简单的说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态。
        当然,对于现在的高级语言,这样的递归问题是不需要用户来管理这个栈的,一切都由系统代劳了。

 

 

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

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

相关文章

操作系统内存管理(上)——内存管理基础

一、内存的基本知识 1.什么是内存&#xff1f;有什么作用&#xff1f; 内存可存放数据。程序执行前先放到内存才能被CPU处理——缓和CPU和硬盘之间的速度矛盾。 给内存的存储单元编址。如果计算机按字节编址&#xff0c;则每个存储单元大小为1字节。即1B8b&#xff08;8个二进…

智能医院导航导诊系统,门诊地图导航怎么做?

现在很多医院都是综合化大型医院&#xff0c;有很多的科室&#xff0c;院区面积也逐渐扩大&#xff0c;一方面给病患提供了更为全面的医疗资源&#xff0c;另一方面&#xff0c;医院复杂的环境也给病患寻医问诊带来了一定的困扰。电子地图作为大家最喜闻乐见的高效应用形式&…

Python的socket模块及示例

13.2 socket模块 socket由一些对象组成&#xff0c;这些对象提供网络应用程序的跨平台标准。 13.2.1 认识socket模块 socket又称“套接字”&#xff0c;应用程序通常通过“套接字”向网络发出请求或应答网络请求&#xff0c;使主机间或一台计算机上的进程间可以通信。sock…

Android 路由框架ARouter源码解析

作者&#xff1a;小马快跑 我们知道在使用ARouter时&#xff0c;需要在build.config里配置&#xff1a; annotationProcessor com.alibaba:arouter-compiler:1.2.2并且知道annotationProcessor用来声明注解解析器&#xff0c;arouter-compiler用来解析ARouter中的各个注解并自…

代码管理记录(一): 码云Gitee代码提交和维护

文章目录 Gitee介绍登录地址代码提交 Gitee介绍 Gitee 是一个类似于GitHub的代码托管平台&#xff0c;是中国的开源社区和开发者社区。它为开发者提供了基于Git的代码托管、协作、部署、代码质量检测、漏洞扫描、容器镜像等服务&#xff0c;同时也提供了一系列的个人资料和社交…

gitlab使用docker简单快速部署

文章目录 前言一、下载gitlab镜像二、安装步骤1.创建docker-compose文件2. 启动及登陆 三、配置页面总结 前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。本文主要用来记录如何使用docker快速搭…

c#笔记-类成员

声明类 类可以使用帮助你管理一组相互依赖的数据&#xff0c;来完成某些职责。 类使用class关键字定义&#xff0c;并且必须在所有顶级语句之下。 类的成员只能有声明语句&#xff0c;不能有执行语句。 class Player1 {int Hp;int MaxHp;int Atk;int Def;int Overflow(){if (…

七大排序算法一文通(易懂图解+优化代码)

目录 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1 递归实现——Hoare版 6.2 递归实现——挖坑法 6.3 非递归实现 6.4 优化 7.归并排序 7.1 归并排序——递归实现 7.2 归并排序——非递归实现 8.复杂度以及稳定性 1.直接插入排序 …

一列数到中位数的总距离最小

一列数到中位数的总距离最小 3554.二进制&#xff08;二进制数的加减法-转化为十进制运算再将结果转回二进制3565.完美矩阵1824.钻石收藏家&#xff08;经典双指针&#xff09; 3554.二进制&#xff08;二进制数的加减法-转化为十进制运算再将结果转回二进制 输入样例&#xff…

i春秋 Misc Web 爆破-1

打开链接是PHP源码 代码审计&#xff1a; include "flag.php"; 表示文件中包含flag.php文件&#xff0c;即根目录下存在flag.php $a $_REQUEST[hello]; 命名一个变量a来接收超全局变量$_REQUEST&#xff08;接收表单’hello’数据&#xff0c;请求一个为hello的参…

研发效能系列 - 质量与速度能否兼得?

作者&#xff1a;冬哥 引言 我们的时间&#xff0c;应该是用于提高软件质量&#xff0c;还是专注在发布更有价值的功能&#xff1f;这貌似是软件研发中永恒的话题。 到底什么是质量&#xff1f;质量有什么特质&#xff1f; 质量与速度是什么关系&#xff0c;两者是一个硬币的…

spring.factories 的作用是什么

spring.factories 文件用于在 Spring Boot 项目中配置自动配置项。它包含了一系列 key-value 对,key 是自动配置类的全限定名,value 是这些配置类对应的条件类。Spring Boot 会在启动时扫描 classpath 下的 META-INF/spring.factories 文件,并加载其中定义的自动配置类。这些自…

[IAR][CC2642R1] IDE安装和环境搭建,CC2642的环境配置

文章目录 一、IAR安装&#xff08;1&#xff09;压缩包下载&#xff08;2&#xff09;IAR安装(3) 注册(4) 补丁 二、在IAR中使用CC2642&#xff08;0&#xff09;打开IAR&#xff0c;配置环境。&#xff08;1&#xff09;例程位置&#xff08;2&#xff09;打开例程&#xff08…

4.Redis10大数据类型

Redis10大数据类型 Which 101.String&#xff08;字符串&#xff09;2.List&#xff08;列表&#xff09;3.hash &#xff08;哈希&#xff09;4.Set&#xff08;集合&#xff09;5.zset(sorted set&#xff1a;有序集合)6.Redis GEO &#xff08;地理空间&#xff09;7.HyperL…

金融贷款行业怎么找客户,运营商数据了解过没?

现如今随着信息社会发展的来临&#xff0c;销售市场呈碎片化发展趋向&#xff0c;各个行业为寻找用户&#xff0c;根据网上广告投放线下推广做活动&#xff0c;但效果微乎其微。拓客越来越难&#xff0c;且成本费也越来越高&#xff0c;成为很多公司的烦恼之处。 从被动获取客…

K8S基础理论,核心组件,数据流向详解

目录 第一章.k8s概述 1.1.什么是云原生 1.2.什么是K8S 1.3.K8S的优势 1.4.K8S的功能 1.5.K8S 的特性&#xff1a; 1.6.Kubernetes 集群架构与组件 第二章.K8S的核心组件 2.1.Master 组件 2.2.配置存储中心 2.3.Node 组件 第三章.Kubernetes 核心概念 3.1.Pod 3.2…

【Unity项目实战】手把手教学:飞翔的小鸟(6)添加障碍

承接上一篇&#xff1a;【Unity项目实战】手把手教学&#xff1a;飞翔的小鸟&#xff08;5&#xff09;背景滚动&#xff0c;我们已经让主角在停止不动的情况下&#xff0c;移动背景图&#xff0c;使得主角小鸟像是自己往前移动了一样&#xff0c;接下来我们将继续往下&#xf…

【王道·计算机网络】第二章 物理层

一、通信基础 1. 基本概念 1.1 物理层接口特性 物理层解决如何在连接各种计算机的传输媒体上传输比特流&#xff0c;不指定具体的传输媒体主要任务&#xff1a;确定与传输媒体接口有关的一些特性 → 定义标准接口特性&#xff1a; 机械特性&#xff1a;定义物理连接的特性&a…

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测。QRDNN模型…

linux 超过4个G的文件传不上去的解决办法

服务器是内网的要挂载镜像 哎呀。。。。超过4个G还挂载不上。。。 解决先分卷压缩&#xff0c;然后上传 上传文件 单个上传再把文件合并成一个 cat Kylin-Server-10-SP2-Release-Build09-20210524-x86_64.zip* >ky.zip 再次解压就好了 unzip ky.zip