不完整的C递归函数。我不知道如何正确实现

时间:2017-04-26 12:29:45

标签: c recursion

我需要在C中实现一个可以模拟pstree的递归函数,也就是说,将下面的数字想象为一个过程:

<eos>

等....

1 (father)
   2 (child of 1)
   3 (child of 1)
     4 (son of 3)
       5 (child of 4)
     6 (child of 3)

但它只打印父级(称为递归函数)和相同的子级,没有其他子级。 我知道另一个对递归函数的调用在前一个孩子的父母中丢失了,但是如何?

完整代码:

void imprime_Pstree(int i, int ntabs)
{
    int k = 0, j = 0, quantProc = 0;
    int procAtual;

    // Prints the number of tabs
    for(k = 0; k < ntabs; k++)
        printf("\t");

    quantProc = preenche_vetor(i);

    // Prints the process name
    imprimeNomeProcesso(i);


    for(j = 0; j < quantProc; j++) {

        imprime_Pstree(processos[j], ntabs+1);
    }

}

2 个答案:

答案 0 :(得分:0)

processos是一个全局变量,包含i的所有子节点的列表。这在递归函数中不起作用。递归调用将覆盖该数组。您必须将其设为局部变量并将其传递给必须赋值的函数:

void imprime_Pstree(int i, int ntabs)
{
    int k = 0, j = 0, quantProc = 0;
    int procAtual;
    int processos[1000];    // <-- have a local array

    // Imprime a quantidade de tabs
    for(k = 0; k < ntabs; k++)
        printf("\t");

    // pass that array to preenche_vetor()
    quantProc = preenche_vetor(i, processos );

   // Imprime o nome do processo
   imprimeNomeProcesso(i);


   for(j = 0; j < quantProc; j++) {

        imprime_Pstree(processos[j], ntabs+1);
   }   

}

当然你还必须更改preenche_vetor()的签名,并且必须在那里进行初始化()。

修改 正如@Aconcagua建议的那样,首先确定孩子的数量然后宣布并填写VLA会更好

答案 1 :(得分:0)

quantProc = preenche_vetor(i);

好吧,现在我们有很多流程。

for(j = 0; j < quantProc; j++)
{
    imprime_Pstree(processos[j], ntabs+1);
}

两种可能的情况:

  1. processos包含系统中当前所有活动进程的列表。然后你就像在数组中找到它们一样迭代这些进程,i。即如果任何进程至少有一个子进程,那么系统中的第一个进程(linux:将是id为0的root进程,通常永远不会死)将始终作为当前进程的子进程打印。您需要一个单独的列表,其中包含您可以迭代的子进程ID!

  2. processospreenche_vetor函数填充给定进程ID的子进程。然后,对imprime_Pstree的任何递归调用都将覆盖被调用者的子进程列表(再次调用preenche_vetor)。解决方案:您需要为每个递归调用提供单独的数组。