リスト 1->2 を指定すると、次のようになります。
- head=1->2、head が null でない、2 で再帰 (5 への継続)
- => head=2、head が null でない、null で再帰 (4 への続き)
- => => head=null、head は null、return
- => 印字ヘッド -> データ "2" と戻ります
- head-data "1" を出力して返す
再発する前に print ステートメントを移動する場合:
void fun1(struct node* head)
{
if(head == NULL)
return;
printf("%d ", head->data);
fun1(head->next);
}
次のようになります。
- head=1->2, head は null ではない, print head->data "1 ", 2 で繰り返す (5 に続く)
- => head=2, head is not null, print head->data "2 ", null で再帰 (4 への続き)
- => => head=null、head は null、return
- =>戻る
- 戻る
どちらの場合も、null 以外のすべてのノードが出力されます。そのうちの 1 つだけを印刷するには、次のようにコードで区別する必要があります。
void print_last(struct node* n)
{
if( n == NULL )
{
printf("empty list!");
}
else if( n->next == NULL )
{
printf("%d", n->data);
}
else
{
print_last(n->next);
}
}
取得した同じリスト 1->2 で呼び出されます。
- n=1->2、n != null および n->next != null、2 で再帰 (3 への継続)
- => n=2、n != null および n == null。n->data "2" を出力して返す
- 戻る
最後の要素が見つかったときに再帰しないことに注意してください。そのため、n が null になる唯一の方法は、空のリンク リスト (NULL) を印刷しようとした場合です。