我正在编写一个霍夫曼算法,我在递归函数中遇到了收集数据的问题。这意味着我有一个递归函数,它从树生成代码,但我想将它们放在数组中(这允许我稍后处理数据)。我写了这个函数
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);
}
}
我想问一下如何在调用之间的递归函数中收集数据。有什么方法可以解决像这样的问题。
答案 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 ++中),可以将其隐藏为私有类成员。
使用全局变量会出现多线程问题(即同时对函数执行多次调用)。
对于我的代码示例,我选择支持简洁程度高于完整性 - 我希望它们具有足够的可读性。