对递推和递归的理解

对递推和递归的理解

1.此问题能否用递推解决

我们以斐波拉契数列问题为例进行阐述,斐波拉契数列为0、1、1、2、3、5、8、13、21、…表现斐波拉契数列为瘦柱状图的形式,如下

我们现在所要解决的问题是求取第n个位置的数值,下面我们正式开始考虑能否用递推解决这个问题(关于递推和递归的区别,将会在下文阐述):

我们考察3号位置,我们发现3号位置的值依赖于1号位置和2号位置,即在1号位置的值和2号位置的值的基础上,我们再进行一些(一个)操作就可以得到3号位置的值。在本例中,这个操作为加法运算。

我们再考察4号位置,同样我们发现4号位置的值依赖于2号位置和3号位置。

我们现在可以建立一种递推关系:F(n) = F(n-2) + F(n-1)。

至此,我们可以抽象出一种模式,这种模式告诉我们:待求位置的值仅仅依赖于前两个位置的值,再进行加法操作即可。换句话说,如果我们知道前两个位置的值,第三个位置的值就可以得到。

是否在起点的临近区间内存在这种模式决定了这个问题能否用递推解决。这里的起点和数学归纳法中的起点的含义一样。

所以本问题可以用递推解决。

2.将这种模式应用于高位

观察上图,我们现在想要求取n号位置的值,根据这种模式,我们只需要知道n-2号位置和n-3号位置的值即可。这样我们就把一个规模大的问题转化成规模小的问题。然后一直向问题规模变小的方向发展即可。

3.总结

总结一下刚才的一系列过程:首先在低位发现一种模式,这种模式可以将规模大的问题转化为规模小的问题。然后将这种模式应用于高位。最后编码。数学归纳法的思想贯穿整个分析过程。


4.将问题的范围从求取一个值扩大到求取一系列操作

下面我们以汉诺塔问题进行阐述,读到这里,应该很累了,哈哈,那我就打个鸡血,下面的文字将会教你在一分钟内解决汉诺塔问题,哈哈,激动吧。首先,我们在低位进行探索,看能否抽象出一种模式。

我们考察三个盘子的情况,下图说明如何移动。

首先将最上面的两个盘子移动到第2根柱子(这是一系列操作),然后将最大的盘子移动到第3根柱子,最后再将第2根柱子上的两个盘子移动到第3根柱子(与上面相同的一系列操作)。至于如何两个盘子从一个第1根柱子移到第2根柱子(借助第3根柱子),以及如何将两个盘子从第2根柱子移动到第3根柱子(借助第1根柱子)我们不必关心,我们只要知道抽象出一种模式。这种模式告诉我们想移动3个盘子,只要知道怎样移动2个盘子。

下面我们将这种模式应用于高位,现在想要移动n个盘子,下面的图片讲述了如何将其转化成移动n-1个盘子

所以我们现在只需要记录下3个盘子移动,然后就可以递推出4个盘子如何移动,5个盘子,…

至此n个盘子如何从一个柱子移动到另一个柱子已经解决。哈哈,应该差不多一分钟。

5.递推和递归的区别

在这里我想谈谈自己对递推和递归的理解,自己感悟,并没有权威参考。

递推是一种关系,由小推大。将递推这种关系用某种计算机语言实现出来为递归。

6.最后

本文到此就结束了,哈哈,其实关于递推还有一些工作需要做,对递推关系的具体编码,分析递归函数的运行时间,递归栈,涉及到的分治技术等等,本文的主要目标是让我们更好的理解递推,更好的认识递推。有了这些认识和理解后,我相信以后的递推之路可以平坦些。在此感谢周兆熊学长(百度,“周兆熊 csdn”)没有他的监督,我也不会很快完成这篇markdown博文。路漫漫其修远兮,吾们将上下而求索,欢迎志同道合的人一起加入我们的小而精悍的微信群,哈哈。

时间: 2024-10-25 06:23:21

对递推和递归的理解的相关文章

递推与递归

递归:函数调用自身的行为叫做递归. 递推:找到前一项与后一项的关系并且清楚其初始条件或者最终结果问题就可以解决问题,这种方法叫做递推. 递推的一般形式:f(n)=a1f(n-1)+a2f(n-2)+...anf(1)+an+1 转: 一般步骤: 1.设函数f(i)的含义 2.从逻辑上寻找f(i)与f(i-1),f(i-2)等等之间的关系 3.写出递推式 4.写出目标f(n) 5.写出初始值(边界)f(0) 6.验证正确性 递推与递归的 相似点: 1.都是把问题拆分成可以解决的子问题 2.一般分析

【递推与递归】极值问题

[递推与递归]极值问题 题目描述 已知m.n为整数,且满足下列两个条件: (1)m.n∈1,2,3,……,k,即1≤m,n≤k (2)(n2-mn-m2)2=1 你的任务是:编程由键盘输入正整数k(1≤k≤109),求一组满足上述两个条件的m.n,并且使m2+n2的值最大. 输入 一个正整数k 输出 按照格式输出对应的m和n的值 样例输入 1995 样例输出 m=987 n=1597 分析:斐波那契数(可归纳证明)代码: #include <iostream> #include <cst

JC2:递推,递归与分治

递推,递归与分治[待完成] 递推的定义 定义:已知初始值F1,通过递推关系式Fn=g(Fn-1)求出最终结果Fn的递推方式称为顺推法:同理,把已知最终结果为Fn,通过递推关系式Fn-1=g'(Fn)求出初始值F1的递推方式称为倒推法. 模板: f[0]=0; f[1]=1; for(int i=1; i<=n; i++) f[i]=f[i-1]+f[i-2]; 具体步骤 找到初始状态 找到递推公式 开始循环算 经典问题 抽屉原理 加法原理 乘法原理 容斥原理 卡特兰数 递归 递归算法 设一个未知

从一道NOI练习题说递推和递归

一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法. 这个问题可以用递归来进行解决,但是解题时间1秒明显不够用.怎么办呢,可以考虑找到“规律”,然后推导公式解决问题,开始画图分析: 这是4个台阶时的全部7种走法,记作f(4)=7.现在观察右侧绿色走过的部分,1234四种情况是3个台阶时的4种走,法记

递推和递归

一.递推算法基本思想: 递推算法是一种理性思维模式的代表,其根据已有的数据和关系,逐步推导而得到结果.递推算法的执行过程如下: 1)根据已有的·结果和关系,求解中间结果 2)判定是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果:如果满足要求,则表示寻找到一个正确的答案. 递推算法往往需要用户知道答案和问题之间的逻辑关系.在许多数学问题中,都有着明确的计算公式可以遵循,因此往往可以采用递推来实现. 2.递推算法示例 如果一对两个月大的兔子以后每个月可以生一对兔子,而一对新生的兔子出

使用递推和递归解决斐波那契数列问题~~~

/** * 使用递推的方式处理斐波那契数列 * @param sum * @param i * @return */ public static int findValue(int n){ if(n==1) { return 1; } if(n==2) { return 2; } int sum=1; int pre=1; for(int i=3;i<=n;i++) { int temp=sum; sum+=pre; pre=temp; } return sum; } /** * 采用递归的方式

poj1163 - DP递推、递归写法

本题超链接:http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50977   Accepted: 30888 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5(Figure 1) Figure 1 shows a number triangle. Write a program that calculat

递推与递归专题练习

CH0301 递归实现指数型枚举 搜索与回溯,指数级算法. #include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdi

0x02 递推与递归

[例题]CH0301 递归实现指数型枚举 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 using namespace std; 7 int n; 8 vector<int> chosen; 9 void calc(int x) { 10 if (x==n+1) {