递归求解细胞分裂问题

来源:互联网 发布:金星网络商学院 编辑:程序博客网 时间:2024/05/21 15:03

题目:初始情况下有一个细胞,每两分钟分裂出一个细胞。两个细胞中,原细胞可按照两分钟规律继续分裂,而分裂出的新细胞有一分钟成熟期。成熟后开始每两分钟分裂出新细胞,以此循环。设计程序计算15分钟后的细胞数量。

一些想法:

递归类似于数学归纳法,先设出能解决问题的F(n),然后找F(n)与F(n-1)的关系。

本题难点就在于:由于多出了一个成熟时段,且成熟时间和分裂时间不用,所以细胞状态很多。

看了两个函数间接递归

fa(){fb(){

call   fb(); call   fa();

} }

突然想到可以根据细胞状态设函数。

我将细胞状态分成三类,设为a,b,c。a为不成熟态,b为半成熟态,c为成熟态。

不成熟态为刚分裂出来,需要一分钟后进入可分裂的半成熟态。半成熟态经过一分钟成为马上要分裂的成熟态。成熟态一分钟后分裂成1个半成熟态和1个成熟态。即为a->b->c->a,b

设t为时间,所以得出关系式:

a(t)=c(t-1)

b(t)=c(t-1)+a(t-1)//因为b细胞有两个来源

c(t)=b(t-1)

代码如下:

#include <stdio.h>#include <stdlib.h>int aa(int t){    if (t == 0)        return 1;    else        return cc(t-1);}int bb(int t){    if (t == 0)        return 0;    else        return aa(t-1) + cc(t-1);}int cc(int t){    if (t == 0)        return 0;    else        return bb(t-1);}int main(){    int t;    while(1)    {        scanf("%d",&t);        printf("%d\n", aa(t+1) + bb(t+1)+cc(t+1));    }    return 0;}


0 0
原创粉丝点击