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

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

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

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

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

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

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

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

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

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

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

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

它表示出来就是这样的

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

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

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

最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资

料的可以关注私信小编“01”即可,希望能对你有所帮助。

秦九韶算法递推公式_如何教会女友递归算法?相关推荐

  1. 如何教会女友递归算法?

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

  2. 求n的阶乘的算法框图_干货丨Python 递归算法指归-百知教育

    1. 递归概述 递归( recursion)是一种编程技巧,某些情况下,甚至是无可替代的技巧.递归可以大幅简化代码,看起来非常简洁,但递归设计却非常抽象,不容易掌握.通常,我们都是自上而下的思考问题, ...

  3. c语言递推公式原理,【图】指标高手的进阶之-公式迭代(原理及应用)_迭代法怎么求收敛阶,牛顿切线法迭代公式,迭代公式,迭代算法,递推公式_指标编写互助答疑论坛_理想论坛 - 股票论坛...

    在掌握了公式语言的一些常用编写方法之后,进阶之路在哪里呢?它们分别是公式分支.公式循环.公式数组.公式迭代和公式接口,只有进一步学习这些高级编程技巧,才能真正达到编写中所思便所得的自如境界.在这其中, ...

  4. 求n的阶乘的算法框图_递归算法是一种直接或者间接调用自身函数或者方法的算法...

    http://blog.csdn.NET/wangjinyu501/article/details/8248492 原版 一.基本概念 递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递 ...

  5. PAT甲级1015 Reversible Primes :[C++题解]进制位、秦九韶算法、判质数

    文章目录 题目分析 题目链接 题目分析 十进制转化为d进制如何做? while(n){n% d; //取d进制数下的最低位n/=d; } 比如 十进制下的n=13 ,进制d =2.经过 反复的n%d ...

  6. PAT甲级1010 Radix :[C++题解]进制位、秦九韶算法、二分(PAT通过率最低的一道题0.11)

    文章目录 题目分析 题目链接 题目分析 分析: 本题思路分两步. 第一步:先把给出数值和进制的数,暂定为N1,转换成10进制,即为target. 第二步: 判断一下N2在多少进制下是等于target的 ...

  7. 各种数制转换——秦九韶算法(转十进制)

    秦九韶算法: C++ 秦九韶算法_yq_sprite的博客-CSDN博客_秦九韶算法 求任意两个不同进制非负整数的转换(2 进制 ∼∼ 16 进制),所给整数在 int 范围内. 不同进制的表示符号为 ...

  8. 秦九韶算法如何应用到计算机,《秦九韶算法》说课稿——获奖说课稿

    <<秦九韶算法>说课稿--获奖说课稿.doc>由会员分享,可免费在线阅读全文,更多与<<秦九韶算法>说课稿--获奖说课稿>相关文档资源请在帮帮文库(ww ...

  9. 机器学习算法 拟合曲线_制定学习曲线以检测机器学习算法中的错误

    机器学习算法 拟合曲线 机器学习 (Machine Learning) The learning curve is very useful to determine how to improve th ...

最新文章

  1. php扩展xdebug安装
  2. Html dom window 对象 open()方法
  3. 为你的集成需求选择合适的ESB
  4. 图的遍历DFS与BFS(邻接表)
  5. linux上安装java环境
  6. 关于router name 的url重写 --frontname rewrite frontname重写!
  7. Qt界面制作(QSS、获取屏幕分辨率、自定义控件、版权)
  8. 工作闲了觉得无聊,忙了觉得累......
  9. Draw.io--自认为最好用的流程图绘制软件
  10. 实现二叉树的三种非递归遍历算法
  11. 当html里语义化,HTML5语义化
  12. JAVA中的“抽象接口”
  13. javascript模板插件amaze.js
  14. Windows副本不是正版
  15. 74HC573锁存器的原理和使用
  16. alert获取输入框内容_Alert弹出框处理
  17. 做一个软件需要了解的知识
  18. Software Engineering at Google翻译-III-8-Style Guides and Rules(风格指南和规则 )
  19. C++ 异常捕获及处理
  20. 《程序员》2012年2期精彩内容:大数据

热门文章

  1. Java 并发编程之 ConcurrentHashMap,ConcurrentSkipListMap
  2. linux设置免密ssh,Linux终端设置免密登陆ssh(以 XShell 为例)
  3. asp.net 登录验证 mysql_Asp.net mvc验证用户登录之Forms实现详解
  4. python列表注解
  5. centos7升级gcc,并安装redis
  6. Mac os安装SEAL
  7. Mac下解决editcap等wireshark配套工具not found
  8. 用c语言编程求分数和,用C语言编程平均分数
  9. 在linux系统下安装jdk
  10. python_str 字符串的所有方法