兔子产子问题

Posted zk126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兔子产子问题相关的知识,希望对你有一定的参考价值。

一、问题描述

  有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?

二、解题思路

  经过分析,这是一到典型的斐波那契额数列问题,可以由迭代来解决问题。

  改题目是典型的迭代循环,即是一个不断用新值取代变量的旧值,然后用变量旧值递推出变量新值的过程。这种迭代与以下几种因素有关:初值,迭代公式,迭代次数。

  此问题算法可分解为

1、迭代公式:f(n+2)=f(n+1)+f(n)。

2、初值:f(1)=1,f(2)=1。

3、循环次数:循环次数由循环变量控制。

三、代码实现

#include<iostream>
using namespace std;
int main()

    int a = 1, b = 1, c;
    printf("%12d%12d", a, b);
    for (int i = 3; i <= 30; i++)
    
        c = a + b;
        printf("%12d", c);
        if (i % 4 == 0) printf("\\n");
        a = b;
        b = c;
    
    return 0;
运行结果:

 

四、代码改进

  以上代码是用三个变量来维护整个迭代过程,其实可以在一个循环中求出后两个值,那样就可以用两个变量来维护这个迭代过程,循环次数也直接少了一半。

在循环中,可以将a看为前面一个变量,b看为后面一个变量。a(第三项)用a(第一项)+b(第二项)来更新,b(第四项)用更新完的a(第三项)和b(第二项)来更新。

代码实现:

#include<iostream>
using namespace std;
int main()

    int a = 1, b = 1;
    for (int i = 1; i <= 15; i++)
    
        printf("%12d%12d", a, b);
        a = a + b;
        b = a + b;
        if (i % 2 == 0) printf("\\n");
    
    return 0;

运行结果:

 

103.兔子产子(菲波那契数列)

#include<stdio.h>
void main()

   int n,i,j,un1,un2,un;
   clrscr();
   puts("********************************************************");
   puts("*   This is a program to Calculate Rabbits Numbers.    *");
   puts("* There is a rabbit couple procreats 2 rabbits 1 month,*");
   puts("* and the young rabbits group and can procreats in the *");
   puts("* end of the second month. In this way,how many rabbits*");
   puts("* are there after n generations?                       *");
   puts("********************************************************");
   for(n=2;n<3;)
   
      printf(" >> Please input number of generations (n>2): ");
      scanf("%d",&n);
      if(n<3) printf("\\n >> Input error!\\n");     /*控制输入正确的N值*/
   
   un=un2=1;
   printf(" >> The numbers of rabbits in first %d generation are as follows:\\n",n);
   printf(" l\\t l\\t");

   for(i=3,j=0;i<=n;i++)
   
      un1=un2;
      un2=un;
      un=un1+un2;      /*利用通项公式求解N项的值*/
      printf(   i%8?" %d\\t":"%d\\n",un);
   
   printf("\\n");
   printf("\\n Press any key to quit...");
   getch();

以上是关于兔子产子问题的主要内容,如果未能解决你的问题,请参考以下文章

兔子产子问题

Python趣味算法学习笔记------兔子产子(不死神兔)

兔子产子

1.5 兔子产子问题

C语言每日一练——第147天:兔子产子问题

兔子产子