递推算法

递推算法

一、递推算法简介

一般是两步:

1、根据题目条件推出递推公式

2、根据递推公式编写代码求解(一般可以写成普通循环和递归)

二、实例

2.1 斐波拉契数列

斐波拉契数列,1 1 2 3 5 8 13 21 34......,写出第n项。

(1)递推公式

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

(2)代码

 1 #include <iostream>
 2 using namespace std;
 3
 4 int Fibonacci(int n);
 5 int Fibonacci_Recursion(int n);
 6
 7
 8 /*
 9     非递归解法:
10     和辗转相除法的非递归解法好像
11     辗转相除法是while循环以及中间是百分号
12     这里是for循环以及中间是加号(f3=f2+f1)
13     for循环是知道循环次数的循环,while循环是单一限制条件的循环
14 */
15 int Fibonacci(int n){
16     int f1=1;
17     int f2=1;
18     int f3;
19     for(int i=3;i<=n;i++){
20         f3=f2+f1;
21         f1=f2;
22         f2=f3;
23     }
24     return f3;
25 }
26
27 /*
28     递归解法:
29     本题的递推条件为: f(n)=f(n-1)+f(n-2) f(1)=1,f(2)=1;
30     递推条件的限制条件 f(1)=1,f(2)=1是递归的限制条件
31     递推条件的公式是递归的主体部分
32     这样来想递归是不是特别简单
33
34     递归和非递归的区别:
35     这里的非递归是从前往后推从而得到结论的,例如通过f(1)和f(2)得f(3), 通过f(2)和f(3)得f(4)...
36     递归却是从后往前,要求 f(9),就要求f(8)和f(7),要求f(8),就要求f(7)和f(6)
37     递归的具体过程这里就不赘述了,递归是先由后往前,再由前往后得到f(9),进行了两轮
38     非递归是直接由前往后到f(9) ,进行了一轮
39 */
40 int Fibonacci_Recursion(int n){
41     if(n==2||n==1) return 1;
42     else{
43         return Fibonacci_Recursion(n-1)+Fibonacci_Recursion(n-2);
44     }
45 }
46
47 int main(){
48     int n;
49     //n=Fibonacci(9);
50     n=Fibonacci_Recursion(9);
51     printf("%d\n",n);
52     return 0;
53 } 

(3)答案

34

三、实例扩展

3.1 台阶问题

有n阶台阶,每次可以跨一阶或者二阶,求总共有多少种走法?

递推公式为f(n)=f(n-1)+f(n-2) f(1)=1,f(2)=1;这里不赘述了。

3.2 兔子问题

农场来了一对小兔子,小兔子两个月可长大,长大后每个月生一对小兔子,求n个月后兔子总对数。

递推公式为f(n)=f(n-1)+f(n-2) f(1)=1,f(2)=1;这里不赘述了。

时间: 2024-08-07 00:09:08

递推算法的相关文章

斐波那契 递推算法

/***Date : 2014.12.10***/ //递推算法:是理性思维模式的代表,根据已有的数据和关系,逐步推导而得出结果. //执行过程:1)根据已知的结果和关系,求解中间结果. ///////////////////// 2)判断是否满足要求,若未满足,则继续根据已知结果和关系求解中间结果:若满足要求,则表示寻找到一个正确答案. //13世纪,意大利数学家斐波那契的<算盘书>中记载:兔子产仔问题. //一对两个月大的兔子,每月都可产仔一对,小兔子两月后的每月也可产仔一对;即1月生,3

数的计数——递推算法

Problem Description 我们要求找出具有下列性质数的个数(包括输入的自然数n).先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 不作任何处理: 在它的左边加上一个自然数,但该自然数不能超过原数的一半: 加上数后,继续按此规则进行处理,直到不能再加自然数为止. Input 输入有多组数据,每组数据为自然数n. Output 对于每组数据输出满足条件的数的个数. Sample Input 6 Sample Output 6 Hint 满足条件的数为6,16

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

组合数递推算法

主要式子:C(n,k)=C(n-1,k-1)+C(n-1,k),C(n,k)表示从n个物品中挑选k个物品的所有组合数. 1 #include<stdio.h> 2 #include<string.h> 3 #define N 10 4 int c[N][N]; 5 void init() 6 { 7 memset(c,0,sizeof(c)); 8 for(int i=0;i<=N;i++) 9 { 10 c[i][0]=1; 11 c[i][i]=1; 12 for(int

c语言递推算法1

递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从最终结果Fn出发进行倒推 } while 当前结果Fi非初始值F1 do 由Fi-1=G(Fi)倒推前项; 输出倒推结果F1和倒推过程; end { of then } else begin { 顺推 } 由题意(或递推关系)确定初始值F1(边界条件); 求出顺推关系式Fi=G(Fi-1); i=1

1.2递推算法

1 生兔子问题 1 #include <stdio.h> 2 #define NUM 13 3 int main() 4 { 5 int i; 6 long fib[NUM] = {1,1}; 7 8 for(i=2;i<NUM;i++) 9 { 10 fib[i] = fib[i-1]+fib[i-2]; 11 } 12 for(i=0;i<NUM;i++) 13 { 14 printf("%d月兔子总数:%d\n", i, fib[i]); 15 } 16

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

算法--递推策略

本文地址:http://www.cnblogs.com/archimedes/p/4265019.html,转载请注明源地址. 递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推.无论顺推还是逆推,其关键是要找到递推式.这种处理问题的方法能使复杂

一天一道算法题---6.6---排列递推(我不会)

感谢微信平台: 一天一道算法题-----每天多一点进步--- 好吧 这题 我看了它的分析 还是感觉很不清晰 自己的思路 闪过 逆序数 但也不行,,, 把题目 先放上来 problem:列出一个 1~n 的排列 可以通过一系列的交换得到(1,2,3--n)比如,{2,1,4,3}需要两次交换(1和2 3和4),(4,2,3,1)需要一次(4和1):给定n和k 统计有多少个排列至少需要K次交换能变成(1,2,3--n); 各位 大神 不要吝啬 留下你们的思路与想法 告知我 thanks... 今天