递推总结

递推总结

来自重庆宏帆八中初2022级1班的一名学生

被某郭茂老师被迫强行自愿写总结!!!


什么是递推

f(n) = 2f(n - 1) + 2
  • 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.递推算法分为顺推逆推两种.

  • 递推不同于递归,相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值.

简单的顺推

所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推.

简单的逆推

所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推.


五种典型的递推关系

Fibonacci数列

在所有的递推关系中,Fibonacci数列是最常见的.

看着代码,好像没啥问题,但你要仔细一想就会发现问题,第i月的卵的数量不是这样的,因为有些之前的卵已经长成虫,而我们再次算上了这些变成虫的卵,所以就多算了,而上面的代码就犯了这个错误,正确代码应该减去已经长成虫的卵.

代码如下

  #include <cstdio>
  int main() {
    long long f[55],g[55]; // f[i]表示第i月成虫数量,g[i]表示第i月新产下的卵
    g[0] = 0;
    f[0] = 0; 
    int x,y,z;
    scanf("%d %d %d",&x,&y,&z);
    for (int i = 1;i <= x; i++) {
        f[i] = 1;
        g[i] = 0; //初始化 
    }    
    g[x + 1] = y;
    f[x + 1] = 1;
    for (int i = x + 2; i <= z + 1; i ++) {
        //f[i] = f[i - x - 1] + f[i - x - 2] * y + g[i - x - 2];
        f[i] = f[i - 1] + g[i - 2];
        g[i] = g[i - x] + (f[i - x] - f[i - x - 1]) * y;
    }
    printf("%lld",f[z + 1]);
        return 0;
  }

Hanoi塔问题

分析

设h(n)为第n个盘子从a柱移到c柱所需移动的盘次.显然,当n = 1时,只需把a柱上的盘子直接移动到c柱就可以,故h(1) = 1.当n = 2时,先将a柱上面的小盘子移动到b柱上面去;然后将大盘子从a柱移到c柱:最后,将b柱上的小盘子移到c柱上,共三个盘次,故h(2) = 3.以此类推,当a柱上有n个盘子,总是先借助c柱把上面的n - 1个盘子移动到b柱,然后再把a柱最下面的盘子移动到c柱上;再借助a柱把b柱上的n - 1个盘子移动到c柱上;总共移动h(n - 1) + 1 + h(n - 1)个盘次.所以可得到h(n) = 2h(n - 1) + 1,边界条件:h(1) = 1.

代码如下

  #include <cstdio>
  long long h[65];
  int main() {
    int n;
    scanf("%d",&n);
    h[1] = 1;
    for (int i = 2;i <= n; i++) {
        h[i] = 2 * h[i - 1] + 1;
    }
    printf("%lld",h[n]);
    return 0;
   }

当然你也可以用递归的方法做,通过推理可以推出h(n) = 2 ^ n - 1.

代码如下

  #include <cstdio>
  #include <cmath>
  int main() {
     long long n;
     scanf("%lld",&n);
     long long sum;
     sum = pow(2 , n) - 1;
     printf("%lld",sum);
     return 0; 
  }

平面分割问题

分析

当平面上已有n - 1条曲线将平面分割成a(n - 1)个区域后,第n条曲线每与曲线相交一次,就会增加一个区域,因为平面上已经有了n - 1条封闭曲线,且第n条曲线与已有的每一条封闭曲线恰好交于两点,且不会与任两条曲线交于同一点,故平面上增加 2(n - 1) 个区域,加上已有的 a(n - 1) 个区域,一共有a(n - 1) + 2(n - 1) 个区域.所以本题的递推关系是 a(n) = a(n - 1) + 2 (n - 1),边界条件是a(1) = 1.

代码如下

  #include <cstdio>
  int a[46346];
  int main() {
    int n;
    a[1] = 2;
    scanf("%d",&n);
    for (int i = 2;i <= n; i++) {
        a[i] = a[i - 1] + 2 * (i - 1);
    }
    printf("%d",a[n]);
    return 0;
  }

当然你还是可以用递归的方法来做.可以推出公式 a(n) = n * (n - 1) + 2.

代码如下

  #include <cstdio>
  int main() {
    int n;
    scanf("%d",&n);
    printf("%d",n * n - n + 2);
    return 0;
  }

Catalan数

分析

令一个k值,k从2开始到n - 1结束,剩下的是 n - k + 1 边形,令f(n)为n边形的划分方式,那么 f(n) = f(k) * f(n - k + 1) (k从2开始,到n - 1结束)想一下为什么要用乘法

代码如下

  #include <cstdio>
  long long sum;
  long long f[42];
  int main() {
    int n;
    scanf("%d",&n);
    f[1] = 1;
    f[2] = 1;
    if (n == 1 || n == 2) {
        printf("0");
        return 0;
    }
    for (int i = 1;i <= n; i++) {
        for (int k = 2 ; k <= i - 1; k++) {
            f[i] += f[k] * f[i - k + 1];
        }
    }
    printf("%lld",f[n]);
    return 0;
  }

第二类stirling数

分析

记f(n, m)为n个球,m个盒子的方法总数.从中取出一个球k有以下情况.当k独占一个盒子,方案数为f(n - 1,m- 1);当k与其他球共享一个盒子,方案数:m * f(n-1,m).那么一共有 f(n - 1,m - 1) + m * f(n - 1,m) 种方法.即 f(n) = f(n - 1,m - 1) + m * f(n - 1,m) 种方法.

代码如下

  #include <cstdio>
  long long a[25][25];
  int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            if (i == j) {
                a[i][j] = 1;
            } else {
                a[i][j] = a[i - 1][j - 1] + j * a[i - 1][j];
            }
        }
    }
    printf("%lld", a[n][m]);
    return 0;
  }

感谢观看这个不正经总结

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,740评论 0 6
  • One 1 the [ðə, ði:] art.这,那 ad.[用于比较级;最高级前] 2 be [bi:,bi]...
    梁培林阅读 9,120评论 0 10
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,281评论 0 2
  • 内容运营,即通过内容与顾客进行一场对话,利用传统媒体与新媒体途径,通过对知识的生产制造以及归顺整合,借助于手段和渠...
    企服盒阅读 300评论 0 0
  • 亲爱的妈妈: 您好! 距离上次给您写信已经是很久之前的事了。这次提起笔,心里总有很多话想要对您说。但是又不知从哪儿...
    李艺然阅读 283评论 0 0