RobertSedwickによるAlgorithmsの本でリストトラバーサルについて読んでいます。関数の定義を以下に示します。トラバースおよび削除関数は反復カウンターパートを持つことができますが、traverseRは持つことができないと述べられています。なぜtraverseRは反復的なカウンターパートを持つことができないのですか?再帰呼び出しが機能の終わりではない場合、つまりトラバースの場合のように、反復することはできません。私の理解は正しいですか?
お手数をおかけしますが、よろしくお願いいたします。
void traverse(link h, void visit(link))
{
if (h == 0) return;
visit(h);
traverse(h->next, visit);
}
void traverseR(link h, void visit(link))
{
if (h == 0) return;
traverseR(h->next, visit);
visit(h);
}
void remove(link& x, Item v)
{
while (x != 0 && x->item == v)
{ link t = x; x = x->next; delete t; }
if (x != 0) remove(x->next, v);
}