簡體   English   中英

在C的遞歸函數中收集數據

[英]Collecting data in recursion function in C

我正在編寫霍夫曼算法,但在遞歸函數中收集數據時遇到問題。 這意味着我有一個從樹生成代碼的遞歸函數,但是我希望將它們放在數組中(這使我以后可以處理數據)。 我寫的功能

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);
  }
}

我想問一下如何在兩次調用之間的遞歸函數中收集數據。 還有什么其他方法可以解決這樣的問題。

通過指針傳遞它:

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 ++中),可以將其隱藏為私人班級成員。

使用全局變量將是多線程問題(即,同時執行多個對函數的調用)。


對於我的代碼示例,我選擇簡潔而不是完整性-我希望它們足夠可讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM