基于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)。

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

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

相关文章

11.16 知识总结(模型层更多内容)

一、 多表查询&#xff08;跨表查询&#xff09; <br class"Apple-interchange-newline"><div></div> 子查询&#xff1a;分步查询 链表查询&#xff1a;把多个有关系的表拼接成一个大表(虚拟表) inner join left join right join 1.1 基于双下划…

电脑版微信图片保存在哪个文件夹,如何一次性全选保存

8-7 电脑版的微信聊天&#xff0c;接收到图片后&#xff0c;会保存到微信的个人数据文件夹中&#xff0c;但是有个问题是这些图片都是加密保存的&#xff0c;普通情况下&#xff0c;确实无法人工去取出来&#xff0c;但是下面有方法可以快速将这些图片在脱离微信的情况下&…

盲目跟风考PMP认证?PMP还剩多少含金量?

pmp含金量在如今&#xff0c;含金量还是不错的&#xff0c;但是也不要盲目跟风考&#xff0c;要确定它对你有用&#xff0c;你也会使用它。 什么人适合考PMP? 1、有项目管理实践经验&#xff1a;PMP是基于项目管理实践经验的认证考试&#xff0c;因此有项目管理实践经验的人…

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…

从哪里下载 Oracle database 11g 软件

登入My Oracle Support&#xff0c;选择Patches & Updates 标签页&#xff0c;点击下方的Latest Patchsets链接&#xff1a; 然后单击Oracle Database&#xff0c;就可以下载11g软件了&#xff1a; 安装单实例数据库需要1和2两个zip文件&#xff0c;安装GI需要第3个zip文…

rsync远程同步(rsync+inotify)

目录 一、概述 1、关于rsync 2、rsync的特点&#xff1a; 3、备份方式&#xff1a; 4、同步方式&#xff1a; 二、rsync相关命令 1、rsync常用命令的选项&#xff1a; 2、启动和关闭rsync服务&#xff1a; 3、关闭 rsync 服务 三、 免交互&#xff1a; 1、免密同步&a…

索引的创建和设计原则

文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引 2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引 3 哪些情况适合创建索引?3.1 字段的数值有唯一性的限制3.2 频繁作为 WHERE 查询条件的字段3.3 经常 GROUP BY 和 ORDER BY 的列3.4 UPDATE、DELETE 的 WHERE 条件…

(七)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、五种算法&#xff08;DBO、LO、SWO、COA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启…

Linux Traefik工具Dashboard结合内网穿透实现远程访问

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

固有时间尺度分解(Intrinsic Time Decomposition,ITD)

代码教程 固有时间尺度分解(ITD) 代码原理 ITD&#xff08;Intrinsic Time Decomposition&#xff09;是一种信号分解方法&#xff0c;用于将信号分解成多个时频组件。它的基本思想是将信号分解为一组原子函数&#xff0c;这些原子函数具有不同的时频特性。 ITD分解的步骤如下…

在微信公众号怎么实现答题活动

微信公众号答题活动&#xff1a;知识就是力量&#xff0c;答题赢取大奖&#xff01; 你是否厌倦了常规的抽奖活动&#xff1f;是否希望通过更有意义的方式与粉丝互动&#xff1f;现在&#xff0c;微信公众号的全新答题活动来啦&#xff01;不仅可以增加粉丝的粘性&#xff0c;…

【2023云栖】郭瑞杰:阿里云搜索产品智能化升级

本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;郭瑞杰 | 阿里云资深技术专家、搜索负责人 演讲主题&#xff1a;阿里云搜索产品智能化升级发布 近日在2023云栖大会上&#xff0c;阿里云搜索负责人郭瑞杰对阿里云搜索产品智…

java的Exception.getMessage为null

之前捕获异常后调用异常的getMessage写日志&#xff0c;日志写的竟然是null&#xff0c;不可思议。发现要调用异常的getCause().getMessage()才能得到异常信息 刻意把密码改错&#xff0c;让异常直达界面&#xff0c;免得有问题时候只能猜

光伏含氟废水吸附处理

#光伏含氟废水吸附处理 氟的来源是冰晶石、萤石、氟磷灰等矿物&#xff0c;在钢铁、有色金属冶炼、铝、玻璃、化肥等工业领域得到广泛应用。 目前&#xff0c;在太阳能板生产中&#xff0c;一项关键工艺就是将氟化氢溶液浸泡在硅片上&#xff0c;以除去表面的磷硅玻璃&#xf…

把GPT知识库当成记事本,非常有趣的玩法,很欢乐!

1. 笔者创建了一个“每天碎碎念”知识库&#xff0c;把重要的事情保存成文件记录&#xff0c;并进行训练。 2. 这样每当我记不清楚的时候 就开始灵魂发问~ 3. GPT最擅长胡编乱造&#xff0c;万一他忽悠我怎么办&#xff0c;别着急。查看“知识原文”就知道他是否忽悠你了。 这…

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

云服务器windows service2022 部署git服务器

1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 ==================================== 进入c:\gitblit\data 目录里面…

python科研绘图:帕累托图(Pareto chart)

目录 帕累托图基本构成 绘制帕累托图的步骤 帕累托图&#xff08;Pareto chart&#xff09;是将出现的质量问题和质量改进项目按照重要程度依次排列而采用的一种图表。以意大利经济学家V.Pareto的名字而命名的。帕累托图又叫排列图、主次图&#xff0c;是按照发生频率大小顺序…

Linux安装RabbitMQ详细教程

一、下载安装包 下载erlang-21.3-1.el7.x86_64.rpm、rabbitmq-server-3.8.8-1.el7.noarch.rpm 二、安装过程 1、解压erlang-21.3-1.el7.x86_64.rpm rpm -ivh erlang-21.3-1.el7.x86_64.rpm2、安装erlang yum install -y erlang3、查看erlang版本号 erl -v4、安装socat …