[英]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.