用了“尾递归”,不一定有尾递归优化。优化要开启-O2选项才行!而且有其他约束条件哦。
c代码:
#include <stdio.h>
#include <string.h>
int geta(int n1, int n2, int n)
{
if(n<=1)
return n2;
else
{
// printf("&n1: %p\n&n2: %p\n&n:%p\n", &n1, &n2, &n);
return geta(n2,n1+n2,n-1);
}
}
#define N 30
#define ASD(x) #x
int main()
{
printf("The " ASD(N) " %d\n", geta(1,1,N));
return 0;
}
geta函数尾递归优化前:
(gdb) disas geta
Dump of assembler code for function geta:
0x080483e4 <+0>: push ebp
0x080483e5 <+1>: mov ebp,esp
0x080483e7 <+3>: sub esp,0x18
0x080483ea <+6>: cmp DWORD PTR [ebp+0x10],0x1
0x080483ee <+10>: jg 0x80483f5 <geta+17>
0x080483f0 <+12>: mov eax,DWORD PTR [ebp+0xc]
0x080483f3 <+15>: jmp 0x8048416 <geta+50>
0x080483f5 <+17>: mov eax,DWORD PTR [ebp+0x10]
0x080483f8 <+20>: lea edx,[eax-0x1]
0x080483fb <+23>: mov eax,DWORD PTR [ebp+0xc]
0x080483fe <+26>: mov ecx,DWORD PTR [ebp+0x8]
0x08048401 <+29>: add eax,ecx
0x08048403 <+31>: mov DWORD PTR [esp+0x8],edx
0x08048407 <+35>: mov DWORD PTR [esp+0x4],eax
0x0804840b <+39>: mov eax,DWORD PTR [ebp+0xc]
0x0804