问题描述

序列 指的是一组对象的集合,其中允许重复。序列分为有限序列和无限序列两种类型,我们通常用 表示序列中的第n个对象。

递归其实就是当前的序列依赖于之前的序列。最典型的案例就是兔子繁衍问题,假设一开始第一个月有1对兔子(A),到了第二个月这对兔子(A)性成熟,到了第三个月这对兔子(A)生出了一对兔子(B)。到了第四个月兔子(A)又生了一对兔子(D),之前刚的兔子(B)性成熟。到了第五个月,兔子(A)又生了兔子E,兔子(B)生出了兔子(F),而兔子(D)性成熟。

当然一图胜过千言万语,也就是下面这个情况

兔子繁衍图

这也就是斐波那契数列,公式为

现在,如果每个具有繁衍能力的兔子能够生出k对兔子,那么n个月后一共有多少对兔子?

结题思路

新的斐波那契数列如下:

第一版递归代码如下:

#include <stdio.h>
#include <stdlib.h>long int FIB(long int n, long int k)
{if (n == 1 || n == 2){return 1;} else{return FIB(n-1,k) + k * FIB(n-2, k);}}int main(int argc, char *argv[])
{if (argc != 3){printf("USAGE: ./FIB n k \n");return 1;}long int n = atoi(argv[1]);long int k = atoi(argv[2]);printf("month is %ld, %ld rabbit pairs per \n", n, k);long total = FIB(n,k);printf("The total number of rabbit is %ld \n", total);return 0;}

注意,这个数字增长的很快,所以用了long int

上面的方法在month很大的时候时候,这些迭代算法的由于会反复求解一些重复的子问题,导致求解速度就会非常慢,比如求解第100个月会有多少个兔子,会需要很久很久。而且很容易导致栈溢出,解决方案就是**动态规划**dynamic programming

动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

代码如下:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{if (argc != 2){printf("USAGE: ./FIBv2 n k \n");}long int n = atoi(argv[1]);long int k = atoi(argv[2]);long int month[n-1];int i = 0;for (i = 0 ; i < n; i++){if ( i == 0 || i == 1){month[i] = 1;} else{month[i] = month[i-1] + k * month[i-2];}}printf("After %ld month, there are %ld rabbits\n", n, month[n-1]); return 0;
}

这个代码在求解第100个月有多少兔子的时候,基本上是秒答。

Rosalind: 兔子与递归相关推荐

  1. C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归)

    C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归) 程序之美 1.C语言,计算1乘以3×5*-乘n的积,并输出结果,n值由键盘接收. #include<stdio.h>v ...

  2. java兔子问题 递归_兔子问题 —— 递归的应用

    兔子问题.递归 public class Test { /** * 兔子问题 * 斐波那契数列 */ @org.junit.Test public void test2() { int m = 5; ...

  3. 生兔子问题(递归思想)

    有一对兔子,从出生后第四个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子.假如兔子都不死,计算第十个月兔子的总数? 分析: 四个月开始生兔子,则:F(N) = f(n-1)+ f(n- ...

  4. Python实例---经典问题生兔子的递归与迭代方法的实现

    Python实例-有一对兔子,从出生后的第3个月起每个月都生一对兔子.小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,求解每个月的兔子总对数数量? 分析问题 前两个月都是1对兔子,第三个 ...

  5. 兔子生兔子之递归问题(递归实现斐波那契数列)

    今天给大家带来一个经典题,斐波那契数列,题目如下: //题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,//小兔子长到第三个月后每个月又生一对兔子.假如兔子都不死,要求根据输入的月份输出对应兔 ...

  6. java递归兔子_兔子问题 —— 递归的应用

    兔子问题.递归 public class Test { /** * 兔子问题 * 斐波那契数列 */ @org.junit.Test public void test2() { int m = 5; ...

  7. java兔子问题 递归_Java递归算法经典实例(经典兔子问题)

    题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思指的是每个月的兔子总对数:假设将兔子分为小 ...

  8. 神奇的兔子数列——算法学习笔记

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  9. hazelcast配置内存_在内存数据网格中引入hazelcast imdg

    hazelcast配置内存 Today's article will be oriented to a very specific concept, which is the In-Memory Da ...

最新文章

  1. 【NLP】Transformer的中年危机?
  2. Java多线程之线程中止
  3. .NET 6新特性试用 | PriorityQueue
  4. 53. 最大子数组和(JavaScript)
  5. 菜鸟玩qt(9)---qt常见问题(转)
  6. 数据模型与决策_好的数据模型最终都为业务而生
  7. sas+eg连接mysql_SAS EG 连接 SQL Server 2017数据库
  8. matlab 实现批量修改文件后缀名 案例
  9. 双击jar包无法运行
  10. spark报错:java.io.IOException: Filesystem closed
  11. 武威市教师职称计算机考试,关于高级教师职称评定述职报告(精选5篇)
  12. mac电脑最好用的图片浏览器,没有之一
  13. Unity3d实现Projector(喷码效果)
  14. Web安全防攻(渗透测试)
  15. 方法引用错误:reason: no instance(s) of type variable(s) exist so that String conforms to Person
  16. 【新书推荐】【2017.06】外国文学(全两册)《囚鸟》+《寻找时间的人》
  17. DRAM BRANK
  18. 假如贸易条件为1单位计算机换22单位小麦,请哪位强人帮我解答下有关国际贸易的一道题...
  19. some problem
  20. 2017-2018年度“互联网经济大奖”榜单揭晓

热门文章

  1. Java NIO系列教程(六) Selector
  2. 祝51CTO 生日快乐
  3. 20100707 学习记录:[System.Web.Script.Services.ScriptService]引用问题
  4. 湖南科技学院计算机科学与技术分数,湖南科技学院计算机科学与技术专业2016年在河南理科高考录取最低分数线...
  5. python精品课_【人生苦短,我用Python】Python免费精品课连载(1)——Python入门
  6. node java php_服务端I/O性能:Node、PHP、Java、Go的对比
  7. nx set 怎么实现的原子性_基于Redis的分布式锁实现
  8. 数据库选型绕不开“CAP定理”是什么
  9. java 内核线程_Java:如何根据cpu内核扩展线程?
  10. C语言中的关键字详略