複雑なツリー構造Tを操作し、2つのコンポーネントツリー構造AとBを返す関数get_trees()があります。これを機能させる唯一の方法は、AとBへのポインターを使用して新しい構造Cを作成することです。 、これはパラメータとして関数に渡され、戻り値でもあります。
typedef struct Composite {
itree *A;
itree *B;
} composite;
composite *get_trees(complextree *T, itree *A, itree *B, composite *C);
ツリーAおよびBのルートノードは、別の関数で初期化されます。
itree *A = new_itree(0);
itree *B = new_itree(0);
A->n = T->a;
B->n = T->b;
composite *C;
C = get_trees(T, A, B, C);
get_trees()は、complextree Tのブランチをウォークダウンし、AとBのノードを割り当ててデータを設定し、サブオードで再帰的に呼び出します。簡略化されたコード:
//code for allocating subnodes of A and B
if (T->nodes != NULL){
for (i=0; i< T->nn; i++){
//code for computing p & q
C = get_trees(T->nodes[i], A->nodes[p], B->nodes[q]);
}
}
コードは正常に機能します。しかし、それは非常に醜いようです。
(1)Cには本質的な意味はなく、複数の値を返すために使用されます。代替手段はありますか?次の線に沿った何か:
(2)次のシグネチャで再帰関数を書くことは可能ですか?
void get_trees(T, A, B);
パラメータとしてAとBのルートノードを渡し、サブノードが再帰関数内に割り当てられている場合、いわばコマンドの連続チェーンがあり、再帰呼び出しが完了するとツリー全体が使用可能になるはずです。それは私にとってはうまくいきませんでした、それでそれは許されてはいけません。誰かがそれが事実である理由を説明できれば、またはよりエレガントな解決策が可能であるならば、私は感謝しますか?
おかげで、幸せな休日。〜RT