首先是用函数递归的方式去分析斐波那契数列
/*
源代码
*/
#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;
}
由于时间关系,分析我汇编的部分就不去写了.
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦