void display (struct node *head, struct node *this){
if (!head) return;
if (!this) return;
printf ("%d ", this->key);
if (this->next == head) return;
display(head, this->next);
}
И, хвостовая рекурсия удаляется компилятором (g cc -O4 -S):
.globl display
.type display, @function
display:
.LFB24:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rdi, %rbp
pushq %rbx
.cfi_def_cfa_offset 24
.cfi_offset 3, -24
subq $8, %rsp
.cfi_def_cfa_offset 32
testq %rdi, %rdi
je .L1
testq %rsi, %rsi
movq %rsi, %rbx
jne .L4
jmp .L1
.p2align 4,,10
.p2align 3
.L12:
testq %rbx, %rbx
je .L1
.L4:
movl 8(%rbx), %edx
xorl %eax, %eax
movl $.LC0, %esi
movl $1, %edi
call __printf_chk
movq (%rbx), %rbx
cmpq %rbp, %rbx
jne .L12
.L1:
addq $8, %rsp
.cfi_def_cfa_offset 24
popq %rbx
.cfi_def_cfa_offset 16
popq %rbp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE24:
.size display, .-display