在C中以递归函数收集数据

时间:2014-04-02 18:11:40

标签: c arrays algorithm recursion

我正在编写一个霍夫曼算法,我在递归函数中遇到了收集数据的问题。这意味着我有一个递归函数,它从树生成代码,但我想将它们放在数组中(这允许我稍后处理数据)。我写了这个函数

void save_code(HuffNode** array, int pos, HuffNode *node, char * table, int depth)
{
  if(node->left == NULL){
    printf("%d - %c > ", pos, node->sign);

    array[pos]->sign = node->sign;
    strcpy(array[pos]->code, table);

    puts(table);
    // save to global table
  }
  else {
    table[depth] = '0';
    save_code(array, pos + 1, node->left, table, depth + 1);
    table[depth] = '1';
    save_code(array, pos + 1 , node->right, table, depth + 1);
  }
}

我有变量pos的最大问题,我想如果我可以增加pos变量(比如in循环),那么我就可以将它保存在位置pos的变量数组中。整个计划在这里:https://github.com/mtczerwinski/algorithms/blob/master/huffman/huffman.c

编辑: 我问自己,全局变量是否可以解决问题 - 经过一段时间的编码 - 答案是肯定的。

int pos = 0; // global variable
void save_code(HuffNode** array, HuffNode *node, char * table, int depth) {
  if(node->left == NULL){
    array[pos]->sign = node->sign;
    strcpy(array[pos]->code, table);
    pos++;
  }
  else {
    table[depth] = '0';
    save_code(array , node->left, table, depth + 1);
    table[depth] = '1';
    save_code(array, node->right, table, depth + 1);
  }
}

我想问一下如何在调用之间的递归函数中收集数据。有什么方法可以解决像这样的问题。

1 个答案:

答案 0 :(得分:1)

通过指针传递:

void save_code(..., int *pos)
{
  // ...
  // use and modify (*pos) as you desire
  // ...
  save_code(..., pos);
  // ...
}

这是一个很好的方法,除了它看起来不太漂亮 - 每个递归调用都有一个额外的参数,你必须使用*pos而不是pos

传递并返回:

int save_code(..., int pos)
{
  // ...
  // use and modify pos as you desire
  // ...
  pos = save_code(..., pos);
  // ...
  return pos;
}

我不会真的推荐这个(至少没有通过指针传递),因为你返回并传递一个似乎没必要的值,因为你只需要做其中一个。

您也不能将此方法用于多个值,但使用struct很容易修复,但如果函数已经返回某些内容,则会变得相当混乱。

并且,为了完整性,全局变量:

int pos = 0; // global variable
void save_code(...)
{
  // ...
  // use and modify pos as you desire
  // ...
  save_code(...);
  // ...
}

这样做的缺点是pos变量在全局范围内浮动,但在很多情况下,可以通过将其static轻松修复,因此它仅限于一个文件,或者,在OOP世界中(例如在C ++中),可以将其隐藏为私有类成员。

使用全局变量会出现多线程问题(即同时对函数执行多次调用)。


对于我的代码示例,我选择支持简洁程度高于完整性 - 我希望它们具有足够的可读性。