我有一个递归函数,它通过四叉树运行,并为每个节点生成一个键。但这仅在我将变量myKey
保存为myKey1
时才有效。如果我不这样做,结果密钥是错误的。但为什么?我不清楚这一点。
这是功能:
void keygen(tree *tn, long unsigned int myKey)
{
long unsigned int myKey1 = myKey; // Why do I need this line?
for(int q=0; q<4; q++){
// 1) Check if child exists
if(tn->child[q] != NULL){
// Make key
myKey1 = (myKey<<DIM)|q;
// Save key
tn->child[q]->key = myKey1;
// Call again if leaf
if(tn -> child[q] -> isLeaf == 0){
keygen(tn->child[q], myKey1);
}
}
}
}
答案 0 :(得分:2)
这一行可能是问题
myKey1 = (myKey<<DIM)|q;
如果你没有制作一个单独的myKey1变量,那么你将在循环的每次迭代中通过DIM进行移位,因此在第四次迭代中,你将移动4 * DIM (并且在移位之间使用各种q值进行按位或运算)。
您的意图似乎只是移动和/或相对于原始键,这是您通过创建新变量而不是修改原始myKey来实现的。