递归-细胞分裂问题

题目:

        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)

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,771评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,156评论 0 2
  • CHAPTER 1: INTRODUCTION 第一章:简介 In this chapter, we discus...
    哈小奇阅读 4,631评论 2 1
  • 8月22日-----字符串相关 2-3 个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消...
    future_d180阅读 4,542评论 0 1
  • 前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google...
    谢kun阅读 12,628评论 0 15