В более простом варианте и gcc хвостовую рекурсию замечает и превращает в цикл, а в этом не хочет - толи плюсы потянули лишнее и замазали картину, толи ещё что. int fact(int i) {
if(i == 1)
return 1;
else
return i * fact(i-1);
}
gcc -O2 -S -fomit-frame-pointer foo.c
.file "foo.c"
.text
.p2align 4,,15
.globl fact
.type fact, @function
fact:
movl 4(%esp), %edx
movl $1, %eax
cmpl $1, %edx
jne .L4
jmp .L3
.p2align 4,,7
.p2align 3
.L7:
movl %ecx, %edx
.L4:
leal -1(%edx), %ecx
imull %edx, %eax
cmpl $1, %ecx
jne .L7
.L3:
rep
ret