一到周末就开始放荡自我,这不带着女朋友去万达电影院看电影(其实是由于整天呆在家敲代码硬是

被女朋友强行拖拽去看电影,作为一个有理想的程序员,我想各位应该都能体谅我),一到电影院,

女朋友说要买爆米花和可乐,我当时二话没说,臣本布衣躬耕于南阳,壤中羞涩,所以单买了爆米

花,买完都不带回头看老板的那种,饮料喝多了不好,出门的时候我带了白开水,还得亏我长得销

魂,乍一看就能看出是个社会精神小伙,女朋友也没多说什么,只是对我微了微笑(我估计是被我的

颜值以及独到的见解所折服),刚坐下没多久,女朋友突然问我,咱们现在坐在第几排啊?电影院里

面太黑了,看不清,没法数,这个时候,如果是你现在你怎么办?别忘了你我是程序员,这个可难不

倒我,递归就开始排上用场了。于是我就问前面一排的人他是第几排,你想只要在他的数字上加一,

就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前

问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告

诉你他在哪一排,于是你就知道答案了。这就是一个非常标准的递归求解问题的分解过程,去的过程

叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。我们用递推公式将

它表示出来就是这样的

f ( n ) = f (n - 1) + 1 其中,f ( 1 ) = 1

f(n)表示你想知道自己在哪一排,f(n-1)表示前面一排所在的排数,f(1)=1表示第一排的人知道自己在

第一排。有了这个递推公式,我们就可以很轻松地将它改为递归代码,如下:

int f(int n) {if (n == 1) return 1;return f(n-1) + 1;
}

女朋友不懂递归,于是我给她讲递归需要满足的三个条件:

1.一个问题的解可以分解为几个子问题的解

何为子问题?子问题就是数据规模更小的问题。就好比,在电影院,你要知道,“自己在哪一排”的问

题,可以分解为“前一排的人在哪一排”这样一个子问题。

2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样

你求解“自己在哪一排”的思路,和前面一排人求解“自己在哪一排”的思路,是一模一样的。

3.存在递归终止条件

把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需

要有终止条件。就好比,第一排的人不需要再继续询问任何人,就知道自己在哪一排,也就是

f(1)=1,这就是递归的终止条件。

如何教女友敲递归代码?

刚刚铺垫了这么多,现在我们来看,如何来教女友敲递归代码?个人觉得,写递归代码最关键的是写

出递推公式,找到终止条件,剩下将递推公式转化为代码就很简单了。

你先记住这个理论。我举一个例子,带你一步一步实现一个递归代码,帮你理解。

假如这里有n个台阶,每次你可以跨1个台阶或者2个台阶,请问走这n个台阶有多少种走法?如果有7个台阶,你可以2,2,2,1这样子上去,也可以1,2,1,1,2这样子上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?

我们仔细想下,实际上,可以根据第一步的走法把所有走法分为两类,第一类是第一步走了1个台

阶,另一类是第一步走了2个台阶。所以n个台阶的走法就等于先走1阶后,n-1个台阶的走法 加上先

走2阶后,n-2个台阶的走法。用公式表示就是:

f ( n ) = f (n - 1) + f ( n - 2 )

有了递推公式,递归代码基本上就完成了一半。我们再来看下终止条件。当有一个台阶时,我们不需

要再继续递归,就只有一种走法。所以f(1)=1。这个递归终止条件足够吗?我们可以用n=2,n=3这样

比较小的数试验一下。

n=2时,f(2)=f(1)+f(0)。如果递归终止条件只有一个f(1)=1,那f(2)就无法求解了。所以除了f(1)=1这一

个递归终止条件外,还要有f(0)=1,表示走0个台阶有一种走法,不过这样子看起来就不符合正常的

逻辑思维了。所以,我们可以把f(2)=2作为一种终止条件,表示走2个台阶,有两种走法,一步走完

或者分两步来走。

所以,递归终止条件就是f(1)=1,f(2)=2。这个时候,你可以再拿n=3,n=4来验证一下,这个终止条

件是否足够并且正确。

我们把递归终止条件和刚刚得到的递推公式放到一起就是这样的:

f(1) = 1;
f(2) = 2;
f(n) = f(n-1)+f(n-2)

有了这个公式,我们转化成递归代码就简单多了。最终的递归代码是这样的:

int f(int n) {if (n == 1) return 1;if (n == 2) return 2;return f(n-1) + f(n-2);
}

我总结一下,写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

如果以后再遇到类似问题,A可以分解为若干子问题B、C、D情况,你可以假设子问题B、C、D已经

解决,在此基础上思考如何解决问题A。而且,你只需要思考问题A与子问题B、C、D两层之间的关

系即可,不需要一层一层往下思考子问题与子子问题,子子问题与子子子问题之间的关系。屏蔽掉递

归细节,这样子理解起来就简单多了。

因此,编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调

用关系,不要试图用人脑去分解递归的每个步骤。

如何教女友玩转汉罗塔

好了,讲完了递归算法,再回到电影院,不说别的,我还真那么做了,我真问了前面一排的人他是第

几排如果不清楚并让他跟我一样问他的上一排,显然,没循环到第三人,我差点被认为是神经病,差

点没被几个社会精神小伙打si,座位事情暂时告一段落,话说这电影属实够无聊,于是我不知是趁热

打铁,还是心血来潮,非要给女朋友玩一个汉罗塔游戏,我这暴脾气,刚实践递归算法被怼,是时候

挽回形象了,不秀一把递归算法我就不得劲。就是这个游戏,至于游戏规则,我觉得你体验一两把绝

对比我说的更加记忆深刻,点击蓝色字体进入汉罗塔游戏,别看4399觉得有点弱zhi,再怎么说也承

载着童年

果然,女朋友是个哈皮,刚过第三关就扑街了,这个时候,头冒五丈光芒的我身披金甲挺身而出(貌

似有一点点小夸张,剧情需要嘛)一声不吭地敲了几行靓丽的代码

public class TestHanoi {public static void main(String[] args) {hanoi(5,'A','B','C');  //可以理解为5个圈或者第5关}/*** @param n  共有N个圈* @param A    开始的柱子* @param B    中间的柱子* @param C    目标的柱子* 无论有多少个圈,都认为只有两个。上面的所有圈和最下面一个圈。*/public static void hanoi(int n,char A,char B,char C) {//只有一个圈。if(n==1) {System.out.println("第1个盘子从"+A+"移到"+C);//无论有多少个圈,都认为只有两个。上面的所有圈和最下面一个圈。}else {//移动上面所有的圈到中间位置hanoi(n-1,A,C,B);//移动下面的圈System.out.println("第"+n+"个圈从"+A+"移到"+C);//把上面的所有圈从中间位置移到目标位置hanoi(n-1,B,A,C);}}}

只要main方法一致行,对着结果移动即可,就跟开了挂一样的,其实汉罗塔问题核心关键是无论有多少个圈,都认为只有两个。上面的所有圈和最下面一个圈。

到这里,教女友敲递归算法代码,你学会了吗?

哦豁,明天还是一个晴天老天赐给宜春一个女朋友吧毕竟我们程序员长得又帅敲代码又好看,是吧哥几个~~

如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!

欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔…

如何教会女友递归算法?相关推荐

  1. 秦九韶算法递推公式_如何教会女友递归算法?

    一到周末就开始放荡自我,这不带着女朋友去万达电影院看电影(其实是由于整天呆在家敲代码硬是 被女朋友强行拖拽去看电影,作为一个有理想的程序员,我想各位应该都能体谅我),一到电影院, 女朋友说要买爆米花和 ...

  2. JAVA自学材料大全与技术路线

    Java学习的正确打开方式 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好 ...

  3. java入门到秃路线导航,元芳你怎么看?【教学视频+博客+书籍整理】

    目录 一.Java基础 二.关于JavaWeb基础 三.关于数据库 四.关于ssm框架 五.关于数据结构与算法 六.关于开发工具idea 七.关于项目管理工具Mawen.Git.SVN.Gradle. ...

  4. Java学习的正确方式

    文章目录 一.Java基础 1.Java基础教学视频 2.Java基础博客文章目录 3.Java基础书籍 二.关于JavaWeb基础 1.JavaWeb基础教程视频 2.关于JavaWeb博客文章 三 ...

  5. JAVA学习路线资料

    java学习路线资料 该博客是摘自其它博主整理的文章,感觉各种视频和书籍链接整理的十分全面,对于初学者来说方便,打算依照博主的架构了解下JAVA开发.虽然主要做嵌入式方面,但了解下JAVA编程也有利于 ...

  6. 用产品思维教会憨憨女友看懂大厂的招聘渠道

    前言 最近面试,拒绝了很多人,我很心痛.所以今天简单聊聊这件事"你凭什么进大厂?",希望分享给同学们两样东西:1.客观事实 2.解决方案 客观事实 为了避免先入为主的输出概念,咱们 ...

  7. 5分钟教会我的程序员女友,什么是工厂模式

    abstract class Car{ private String name; public abstract void drive(); public String getName() { ret ...

  8. python真假命题_程序员冒死揭开家暴内幕:教女友学Python是道送命题!

    近期,某网站发出了一个调查问题: 2018-2019年科技行业最火的关键词有哪些? 上线5小时便有3.6万人参与,经过盘点,"人工智能"和"Python"则脱颖 ...

  9. 有一个会做饭的女友是一种怎样的体验?

    苏打水 ,我在红楼 你在西游 米随随. 大猫 等 6800 人赞同 再更: 被公众账号转发一次之后我朋友圈被刷爆了(T▽T) 谢谢来问我家还要不要宠物的孩纸们,我爱你们,你们也要爱自己,千万别找我这种 ...

最新文章

  1. pageEncoding和ContextType区别
  2. python连接spark_python如何通过pyspark的API操作spark
  3. 异常-异常捕获的完整语法
  4. CRC-16校验C#代码
  5. Git 几个常用操作
  6. SVG与CSS的特殊性
  7. python 熊猫钓鱼_Python数据结构与算法之使用队列解决小猫钓鱼问题
  8. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
  9. 计算机控制课设串级回路,计算机控制系统课程设计
  10. 离散数学与c语言程序设计,2016年中山大学数据科学与计算机学院S6705002离散数学与C程序设计)之C程序设计复试笔试最后押题五套卷...
  11. 软件性能分析与优化详解
  12. 原来可视化还能这么美...
  13. Day03 爬取京东商品信息+元素交互操作+BeautifulSoup4
  14. ORA-01045:user C##KD lacks CREATE SESSION privilege;logon denied
  15. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...
  16. Unity3d之设计模式(二)工厂模式
  17. python3进阶之正则表达式之re模块之分组(group)、贪心匹配、编译
  18. Java基础学习——第十四章 网络编程
  19. 6W字的Hive讲解只为你更懂它
  20. 2019年7月勒索病毒疫情分析

热门文章

  1. Windows自动化上传文件至FTP
  2. java实现图片文件存储到数据库
  3. 解决问题:相机SD卡读取时出现损坏情况需要格式化
  4. word2007 在左侧显示目录
  5. 2022-2028年全球与中国虚拟宽带网络网关(vBNG)行业竞争格局与投资战略研究
  6. 火山安卓卡片布局器基本使用方式
  7. Mac彻底删除系统自带的软件
  8. Python-玩转数据-漏斗图绘制
  9. [附源码]SSM计算机毕业设计流浪宠物免费领养系统JAVA
  10. 售后技术支持管理指标实践