【CS50】Lab5:Inheritance基因遗传

406 阅读2分钟

磨磨叨叨:迭代好奇妙,就好像rick创造微观宇宙微观宇宙创造微微观宇宙微微观宇宙创造微微微观宇宙一样,你只要下一个命令,【创建微观宇宙】,就好像会有看不见小人一级一级传下去,直到创造出无穷多个微微…微观宇宙。 person *create_family(int generations) p->parents[0] = create_family (generations-1);

在create_family中create_family。啊啊啊啊,怎么感觉好像一部无穷无尽被诅咒的家族史……

模拟基因遗传问题,一个孩子的基因由父母遗传,父母的基因由祖父辈遗传。 重点:练习 linked lists 和 tree 的用法。

复习知识点:

  1. tree:是一种 data structure,其中每个 node 指向两个其他 nodes。
  2. set linked lists 中 node 的 value
node *n = malloc(sizeof(node));
    if (n == NULL)
    {
        return 1;
    }

    // ** 此处为重点** Set the value and pointer in our node
    n->number = 1;
    n->next = NULL;

问题解决方案: 使用 recursion。

  1. 如何创建 family?
  • 定义一个 person:
typedef struct person
{
    struct person *parents[2];
    //一个 person有两个名为 parents 的指针;
    char alleles[2];
    //一个 person 有两个基因;
}
  • 首先我们在 prototype 中确定了一个功能:person *create_family(int generations)
  • 创建一个人,非常简单(之前已经确定了 person 的 structure—— person *p = malloc(sizeof(person));
  • 创建 3generation 的 family(就是父母再创建一次 family),俺在这里卡了:
p->parents[0] = create_family (generations-1);
p->parents[1] = create_family (generations-1);

其实就是用 recursion 的思想,父母要 create family 就让他们 create 呗,再 call 一次这个 function 就好了。 我想了半天,当代码行进到 create_family (generations-1)时,可以想象我们在这个命令下方创建了一个 person f,这个 person f 这次只需要 create 一个 family。如果是 4 代 5 代,也这样一直重复下去。

  • 定义人从祖父母-父母那里遗传基因。
p->alleles[0] = p->parents[0]->alleles[rand() % 2];
p->alleles[1] = p->parents[1]->alleles[rand() % 2];

这里迷惑了一下子为什么用随机数 2,以及父母的基因遗传在哪里体现。 祖父母一辈时,他们的 parents 指向了 NULL,所以会随机分配 ABO 三种基因。 父母一辈时,他们重新经历了一遍这串代码,person father 和 person mother 从他们的父母各拥有的两个基因中挑了一个。

  1. 如何 free family?
void free_family(person *p)
{
    // TODO: Handle base case
    if(p == NULL)
    {
        return;
    }
    // TODO: Free parents
    free_family(p->parents[0]);
    free_family(p->parents[1]);
    // TODO: Free child
    free(p);
}

这个 free parents 中又是 recall 了 free_family 这个命令。