基于C#实现猴子偷桃

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第 10 天刚好剩一个。问猴子第一天摘了多少个桃子?
分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要我们找到递推公式,问题就迎刃而解了。
令S10=1,容易看出 S9=2(S10+1), 简化一下
S9=2S10+2
S8=2S9+2

Sn=2Sn+1+2
用递归试一下:

 class Program{static void Main(string[] args){int sum = SumPeach(1);Console.WriteLine("第一天摘得桃子有:{0}", sum);Console.Read();}//递归static int SumPeach(int day){if (day == 10)return 1;return 2 * SumPeach(day + 1) + 2;}}

当我们玩转递归的时候,老师说线性递归会将“变量,参数,返回值”在“递”的过程中压栈,如果迟迟“递”不到头的话,栈就会越积越多,最后就爆掉了,window 中系统默认的堆栈空间是 1M。
那么解决方法是什么? 尾递归,下面我们继续上代码:

 class Program{static void Main(string[] args){int sum = SumPeachTail(1, 1);Console.WriteLine("第一天摘得桃子有:{0}", sum);Console.Read();}//尾递归static int SumPeachTail(int day, int total){if (day == 10)return total;//将当前的值计算出传递给下一层return SumPeachTail(day + 1, 2 * total + 2);}}

5be596f3d70d4409c59a5e2947269e59.png
那么两种递归有什么区别呢?
91427098cace1bbcb3071c36f7dc838d.png
从图中我们可以清晰的看到“线性递归”和“尾递归”的区别,那到底有什么本质区别呢?尾递归中在每次向下递归的过程中,都会将当前层的结果计算出来后向下一层传递,从理论上说,传到下一层后,上一层的参数值已经没有存在的必要了,可以清除上一层中的变量占用的栈空间,那么最终达到的效果就是永远不会出现 StackOverflowException 了,但实际上是否真有这个效果,得要看编译程序是否真的给你优化了。
下面我们将 day=10 改成 day=int.MaxValue,跑一下程序看看:
c4b225a66887765dd711957b216e1486.png
很可惜,有图有真相,抛出异常了。
下一步我们就要计算一下这个递归的时间复杂度是多少,关于求“递归”的时间复杂度主要有三种:

  1. 代换法。
  2. 递归树法。
  3. 主定理。

这一篇我就说下代换法,作法如下
①:猜一下递归式复杂度的上界或者下界。
②:用数学归纳法证明你的复杂度是正确的。
为了具有通用性,我们将“猴子吃桃”的问题反过来写,也就是已知 S1,求 S10,当然原理是一样的,通用公式就有如下形式:
Tn=2Tn-1+2 ①
假使 Tn=O(n) ②
则必定存在一个 c>0 的自然数使
Tn<=cO(n)=cn ③
③ 代入 ① 知
Tn<=2c(n-1)+2=2cn-2c+2
=cn-c+1
=cn-(c-1)
当 c>=1 时,则必有 Tn<=cn
最后得出递归式的时间复杂度为 O(N)。

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

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

相关文章

盘点一款制作电子杂志的网站,小白也能快速上手

​电子杂志作为一种时尚、环保、便捷的宣传形式&#xff0c;越来越受到各行各业的青睐。无论是企业宣传、产品推广&#xff0c;还是个人分享&#xff0c;电子杂志都能展现出独特的魅力。而制作电子杂志&#xff0c;不再是专业人士的专属&#xff0c;现在小白也能快速上手&#…

Synchronized面试题

一&#xff1a;轻量锁和偏向锁的区别&#xff1a; &#xff08;1&#xff09;争夺轻量锁失败时&#xff0c;自旋尝试抢占锁 &#xff08;2&#xff09;轻量级锁每次退出同步块都需要释放锁&#xff0c;而偏向锁是在竞争发生时才释放锁&#xff0c;线程不会主动释放偏向锁 二&…

酸性设计——它的独特性和特点都在这里了

酸性设计,一个出乎意料且奇特的概念&#xff0c;实则蕴藏着丰富的创意设计思维和科学内涵。这一术语首次被引入设计领域&#xff0c;是为了探索化学元素在设计中的独特魅力和无限可能。现在&#xff0c;让我们一起进入酸性设计的世界&#xff0c;揭示其独特之处&#xff0c;理解…

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 &#xff1a; 思路拓展 问题一&#xff1a; 问题二&#xff1a; 总结&#xff1a; 问题三&#xff1a; 证明总结第三点 总结&#xff1a; 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路&#xff1a; 1.环形链表Ⅰ 141. 环形链…

如何深度了解汤泉场所?VR全景给你答案

天气逐步转凉&#xff0c;温泉、水会这些室内汤泉场所开始登上消费的主战场。伴随着人们物质生活水平的提高&#xff0c;人们对休闲养生会馆的要求也愈发旺盛&#xff0c;汤泉场所也逐渐从单一的洗浴开始向休闲、娱乐、保健、桑拿等多种业态形式发展&#xff0c;那么大家如何深…

windiws docker 部署jar window部署docker 转载

Windows环境下从安装docker到部署前后端分离项目(springboot+vue) 一、前期准备 1.1所需工具: 1.2docker desktop 安装 二、部署springboot后端项目 2.1 部署流程 三、部署vue前端项目 3.1相关条件 3.2部署流程 四、前后端网络请求测试 一、前期准备 1.1所需工具: ①docke…

SQL自学三部曲_Part3:关于SQL必须要知道的一切

文章目录 一、关于SQL必须要知道的一切&#xff08;1&#xff09;SQL是什么?&#xff08;2&#xff09;你为什么要学SQL?&#xff08;3&#xff09;SQL到底要学什么? 二、 SQL学习的三个阶段&#xff08;1&#xff09;理解运行原理&#xff0c;串联核心语句&#xff08;2&am…

AI换脸的一种技术实施例

刚刚看一个帖子的时候发现了AI识别中一个可以利用到其它场景的的一个通用处理步骤&#xff1a;人脸矫正。 人脸识别过程&#xff1a; 1.首先识别到关键的人脸部分&#xff0c;经过一个粗筛过程&#xff0c;把目标物的脸部图样先抓出来。 2.然后&#xff0c;因为人脸的水平&…

推介会如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式&#xff0c;旨在促进交流活动&#xff0c;形成合作&#xff0c;从而带来共同利益。推介会的本…

C#WPF文本转语音实例

本文介绍C#WPF文本转语音实例 实现方法:使用类库(SpeechSynthesizer )实现的。 一、首先是安装程序包。 二、创建项目 需要添加引用using System.Speech.Synthesis; UI界面 <Windowx:Class="TextToSpeechDemo.MainWindow"xmlns="http://schemas.micr…

计算机组成原理-总线(学习这一篇就够了!)

目录​​​​​​​ 一、总线概述与结构 1.总线原理&#xff1a; 2.总线分类 &#xff08;1&#xff09;片内总线&#xff1a; &#xff08;2&#xff09;I/O总线&#xff1a; &#xff08;3&#xff09;系统总线&#xff1a; 3.总线的特性 &#xff08;1&#xff09;…

Angular 由一个bug说起之二:trackBy的一点注意事项

trackBy是angualr优化项目性能的一种方法, 通过返回一个具有绑定性的唯一值, 比如id&#xff0c;手机号&#xff0c;身份证号之类的&#xff0c;来让angular能够跟踪数组的项目&#xff0c;根据数据的变化来重新生成DOM, 这样就节约了性能。 但是如果是使用ngFor循环组件&…

如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

2023年香港优才计划申请确实火爆,但请冷静!结合个人条件再考虑!

2023年香港优才计划申请确实火爆&#xff0c;但请冷静&#xff01;结合个人条件再考虑&#xff01; 自从香港优才计划实施取消年度限额&#xff0c;为期两年的优化措施以后&#xff0c;无论是申请数量还是获批数量都猛增。今年第二季度的获批量与第一季度的2,073宗相比&#xf…

RabbitMQ 安装及配置

前言 当你准备构建一个分布式系统、微服务架构或者需要处理大量异步消息的应用程序时&#xff0c;消息队列就成为了一个不可或缺的组件。而RabbitMQ作为一个功能强大的开源消息代理软件&#xff0c;提供了可靠的消息传递机制和灵活的集成能力&#xff0c;因此备受开发人员和系…

c# - - - Application.StartupPath(程序安装目录)和Environment.CurrentDirectory(程序工作目录)

Application.StartupPath 应用程序的安装目录&#xff0c;不会改变。 在C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug目录中&#xff0c;运行ConsoleApp6.exe。 安装目录为&#xff1a;C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug 在C:\Users…

​软考-高级-系统架构设计师教程(清华第2版)【第5章 软件工程基础知识(190~233)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第5章 软件工程基础知识&#xff08;190~233&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

050-第三代软件开发-软件部署脚本(二)

第三代软件开发-软件部署脚本(二) 文章目录 第三代软件开发-软件部署脚本(二)项目介绍软件部署脚本(二) 关键字&#xff1a; Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Languag…

外汇天眼:「外汇回撤」这术语是指什么?

"外汇回撤"是外汇交易中一个常见的专业术语。对于许多投资者&#xff0c;尤其是初学者来说&#xff0c;可能并不十分理解这个术语的实质。下面我们将详细介绍外汇回撤的含义。 外汇回撤通常被称为"外汇百分比回撤"。在外汇市场出现强烈趋势波动时&#xf…

Ubuntu中安装R语言环境并在jupyter kernel里面增加R kernel

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…