递归--斐波那契数(2)

前言:本文章只讲述关于递归知识,因为作者认为递归是一个非常难以理解的东西,有必要专门用一篇文章铺垫一下,在下一节才会讲述如何根据斐波那契数这一问题运用递归,且下文中所涉及的例子是作者举的一个笨蛋专属例子。
下文所涉及例子:

F(0) = 0,F(1) = 1,
当 n>0 时,G(n)=1,
F(n) = F(n - 1),F(n) = G(n),其中 n > 1。求F(n)。

涉及知识点:栈、方程(即是指含有未知数的等式)。

  首先,递归是一种算法,即是解决问题的方法,是一个整体过程,这与前面章节所说的栈是不同的,栈只是一种数据结构,数据结构需要算法去运作它。一般问题的解决是需要数据结构+算法。(这种大的思维框架至关重要,你至少要知道数据结构≠算法
  百度上递归定义:一种通过重复将问题分解为同类的子问题而解决问题的方法。定义不愧是定义,准确优雅精简,而且不好理解。定义重点:1、分解为同类子问题2、重复分解子问题。
  第一点,分解子问题+同类子问题。首先分解,如何分解,就把它拆开嘛。简单,要么是F(n-1)要么是G(n),如果靠直觉会觉得就是F(n-1),但在这里作者分析是这样的,等式不等于分解,F(n)与G(n)是同规模问题,它们中间等式不意味着分解,而是平等替代,故拆开后并不是G(n)。然后同类子问题,你是否能够说服自己F(n)与F(n-1)为同类问题呢?这不都是同一个函数嘛,还不是同类问题?**作者!好的,我希望你在写斐波那契数也能如此快速看出子问题。
  第二点,重复分解,根据等式F(n)=F(n-1),F(n)->F(n-1)->F(n-2)->…->F(1)。太简单了,它每次都减一嘛。可如果F(n)=F(n-5)是否可重复呢,我不知道,但是这里至少F(3)是算不了的,F(9)也是算不了的。(请停下来思考为啥不可以)

F(9)不可以原因:F(9)->F(4)->F(-1),可是我们已知信息中并不包括F(-1)也推到不出来它,F(4)同理,这如同一个人走路一样,你不仅要向前走(即方向,这里为n-5),也得有“落脚地”,即目标结果存在有效,这里就是没有“落脚点”。

  如果有时间我希望你能写出上面笨蛋问题的答案,这应该没有难处。

class Solution {
public:
    int stupidQuestion(int n) { //F(n)
			if (n == 1) //已知信息
				return 1;
			else
				return stupidQuestion(n-1); //分解开:F(n) = F(n-1)
    }
};

  代码实现具体过程,先下去,F(n)->F(n-1)->…->F(1),获取到已知信息,再回去(return回去的),F(1)->F(2)->…->F(n),好了这恐怕就是它为何叫做递归,可能因为它的实现过程就是这样的。
  如果心细的读者会发现,问题中还有一个信息我没有考虑,F(0)=0。请自己思考为何用F(1)而不是F(0)。(这里初学者可能会觉得很直观,没有什么原因,可是当问题复杂度起来之后,我们就会难以分辨出有效信息,所以请你务必说服自己)
  看到这,希望你至少记住了递归的定义以及它为何要做递归。下一章节我将讲述如何根据斐波那契数问题运用递归。

  初学者对于递归不清楚的理解一般分为两种:1、停留在具体过程,F(n)调用F(n-1)、F(n-2),然后跟着表达式一样将他们加一下,这样一直调用下去,一直相加,最后就出来。
2、迷失于大致整体,知道递归是处理比自己小一级的任务,通过一步步解决小规模的问题最后得出大规模的答案,只是不清楚具体细节,遇到递归需要考虑多个步骤时往往会迷惑。

  对于第一种理解,这是十分正常的。人类学习一个东西往往先是通过使用它。我建议着重理解子问题与分解这一个块,理解为何要分解,为何通过分解能得出答案。
  对于第二种理解,我建议你仅站在递归其中一层考虑上下层,找到上下层具体关系,着重于其具体实现过程。

  如果你有所感悟,请自己写几个递归题练习一下。

  作者闲聊:今天出考研成绩了,结果还是一如既往的差,268,恐怕同学上去踩两脚都比我高吧。但即使这样,我也希望和我一样有着孵化百年周期的笨蛋不要放弃,就算可能这辈子在壳里,我也至少要在这壳上画一幅自认为美丽的画。
  文章不足之处,不方便理解处待指正。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值