首先是用函数递归的方式去分析斐波那契数列
/* 源代码 */ #include "stdio.h" int FunctionRecursion(int n) //函数的递归,增加内存开销.因为会一直调用函数直到函数返回 { if (n == 1 || n == 0) { return n; } else //f(n) = f(n-1)+f(n-2);n == 1 || n==0 { return FunctionRecursion(n-1)+ FunctionRecursion(n-2); } } int main(void) { printf("%d",FunctionRecursion(10)) ; return 0; }
首先看mian函数
00CA1500 | | push ebp | 4_5.Function_Recursion.c:17 00CA1501 | | mov ebp,esp | 00CA1503 | | push A | 4_5.Function_Recursion.c:18 00CA1505 | | call 4_5.function_recursion.c.CA1041 | Function_Recursion 记住地址0x00CA1041 00CA150A | | add esp,4 | 00CA150D | | push eax | functionrecursion返回值 00CA150E | | push 4_5.function_recursion.c.CAA000 | 格式化 符号 %d 00CA1513 | | call 4_5.function_recursion.c.CA1082 | printf函数 00CA1518 | | add esp,8 | 00CA151B | | xor eax,eax | 4_5.Function_Recursion.c:19 00CA151D | | cmp ebp,esp | 4_5.Function_Recursion.c:20 00CA151F | | call 4_5.function_recursion.c.CA115E | CheckEsp函数
然后呢进入到0xCA1041 这个函数里面去观察FunctionRecursion到底是怎么执行的
00CA14B0 | | push ebp | 4_5.Function_Recursion.c:3 00CA14B1 | | mov ebp,esp | 00CA14B3 | | push esi | 00CA14B4 | | cmp dword ptr ss:[ebp+8],1 | 4_5.Function_Recursion.c:4 00CA14B8 | | je 4_5.function_recursion.c.CA14C0 | 判断参数1是否是1 如果等于就跳转 不等于则判断是否等于0 00CA14BA | | cmp dword ptr ss:[ebp+8],0 | 00CA14BE | | jne 4_5.function_recursion.c.CA14C7 | 判断参数1是否等于0 如果不等就跳转,等于就不跳, 00CA14C0 | | mov eax,dword ptr ss:[ebp+8] | 以上的两个逻辑其实就是if语句 00CA14C3 | | jmp 4_5.function_recursion.c.CA14E9 | 跳转至函数尾部 00CA14C5 | | jmp 4_5.function_recursion.c.CA14E9 | 跳转至函数尾部 00CA14C7 | | mov eax,dword ptr ss:[ebp+8] | 将我们传入的参数初始是10 00CA14CA | | sub eax,1 | 00CA14CD | | push eax | 00CA14CE | | call 4_5.function_recursion.c.CA1041 | 将10减去1之后调用函数本身,函数本身返回的数值 赋值给eax 00CA14D3 | | add esp,4 | 00CA14D6 | | mov esi,eax | 返回值给到eax 00CA14D8 | | mov ecx,dword ptr ss:[ebp+8] | 00CA14DB | | sub ecx,2 | 00CA14DE | | push ecx | 00CA14DF | | call 4_5.function_recursion.c.CA1041 | 将10减去2之后调用函数本身,函数本身返回的数值 赋值给eax 00CA14E4 | | add esp,4 | 00CA14E7 | | add eax,esi | 返回值1加上返回值2就等于我们的数值了 00CA14E9 | | pop esi | 4_5.Function_Recursion.c:13 00CA14EA | | cmp ebp,esp | 00CA14EC | | call 4_5.function_recursion.c.CA115E | 00CA14F1 | | pop ebp | 00CA14F2 | | ret |
那么我们现在看到的是FunctionRecursion函数的原形.
我们假定传入10.那么程序会先判断这个值是否是1或者是0
如果不是
将10-1然后 再去调用函数本身, 那么函数本身就会来9 - 1 同理再调用函数本身 一直到函数传入的参数是1或者是0
然后函数本身再回去执行10-2 9-2 8-2…等等的函数
这就是函数的递归
函数的递归其实对内存的开销比较打,这里一般就用循环语句来表示
源代码
#include "stdio.h" int iFibonaccisequence(int n)//斐波那契数列 { int iResult = 1 ; //用于返回 int last = 0; //用于记录iResult上一个值 for (int i = 0; i <n-1; ++i) { int tmp = iResult; iResult = iResult+ last; printf("%d\n",iResult); last =tmp; } /* 我的理解 * 根据公式已知的结果推导公式再输出结果 * 而函数递归是根据公式推导结果再输出结果 * */ return iResult; } int main(void) { printf("%d",iFibonaccisequence(10)) ; return 0; }
由于时间关系,分析我汇编的部分就不去写了.