递归-细胞分裂问题

2020-04-16  本文已影响0人  QaoKi

题目:

        1 个细胞的生命周期是 3 小时,1 小时分裂一次。求 n 小时后,容器内有多少细胞?

思路:

        很明显要用递归,首先要写出 n 小时以后,细胞的数量 递归公式 f(n)

        细胞的生命周期是3个小时,也就是分裂3次以后死亡

        f(n) 和 f(n-1) 的关系为,f(n) = 2*f(n-1) - 死亡的细胞数

        f(0), 1 个

        f(1), 2 个

        f(2), 4个

        f(3), 8个,但是f(0)的细胞生命周期结束,所以f(3)应该是 7 个细胞

        f(4), 14个,此时f(1)的细胞生命周期结束,直观上我们会直接减去 f(1),剩下 12 个,得到公式 f(n) = 2*f(n-1) - f(n-3),但这是错误的,因为f(1)两个细胞中的一个,在f(3)的时候已经死了,所以应该减去 1 个,剩下 13 个

        f(5), 26个,同理,此时f(2)的细胞生命周期结束,但是f(2)的4个中2个已经死了,所以不应该减4,应该减2,剩下24个

        从上面的分析来看死亡的细胞数计算,死掉的细胞数并不是前3小时的细胞总数f(n-3),因为这里面包含n-3时刻新生的细胞和老细胞,很显然老细胞在n时刻之前就已经死完了。此时死掉的细胞数应该是n-3时刻新生的细胞数,而n-3时刻新生的细胞数正是前一时刻总的细胞数,即f(n-4),因此正确的计算公式是f(n)=f(n-1)x2 - f(n-4)

代码: go 版本

func recursion(n int) int {

    if n == 0 {

        return 1

    }

    if n == 1 {

        return 2

    }

    if n == 2 {

        return 4

    }

    if n == 3 {

        return 7

    }

    return recursion(n-1)*2 - recursion(n-4)

}

func main() {

    n := 5

    count := recursion(n)

    fmt.Println(count)

}

上一篇下一篇

猜你喜欢

热点阅读