斐波那契数列(Fibonacci sequence)

描述:斐波那契数列(Fibonacci sequence),指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n ≥ 2,n ∈ N)*

  • 递归方法
int Fibon1(int n){
    if (n == 1 || n == 2){
        return 1;
    } else{
        return Fibon1(n - 1) + Fibon1(n - 2);
    }
}
int main(){
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret = Fibon1(n);
    printf("ret=%d", ret);
    return 0;
}

汇编
12: int main() {
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,48h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-48h]
0040107C mov ecx,12h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
13: int n = 0;
00401088 mov dword ptr [ebp-4],0
14: int ret = 0;
0040108F mov dword ptr [ebp-8],0
15: scanf("%d", &n);
00401096 lea eax,[ebp-4]
00401099 push eax
0040109A push offset string “%d” (00425028)
0040109F call scanf (00401110)
004010A4 add esp,8
16: ret = Fibon1(n);
004010A7 mov ecx,dword ptr [ebp-4]
004010AA push ecx
004010AB call @ILT+5(_Fibon1) (0040100a)
004010B0 add esp,4
004010B3 mov dword ptr [ebp-8],eax
17: printf(“ret=%d”, ret);
004010B6 mov edx,dword ptr [ebp-8]
004010B9 push edx
004010BA push offset string “ret=%d” (0042501c)
004010BF call printf (00401170)
004010C4 add esp,8
18: return 0;
004010C7 xor eax,eax
19: }
004010C9 pop edi
004010CA pop esi
004010CB pop ebx
004010CC add esp,48h
004010CF cmp ebp,esp
004010D1 call __chkesp (004011f0)
004010D6 mov esp,ebp
004010D8 pop ebp
004010D9 ret

  • 非递归方法
#include<stdio.h>
#include<stdlib.h>

int Fibno2(int n){
    int num1 = 1;
    int num2 = 1;
    int tmp = 0;
    int i = 0;
    if (n < 3){
        return 1;
    }else{
        for (i = 0; i <= n-3; i++){
            tmp = num1 + num2;
            num1 = num2;
            num2 = tmp;
        }
        return tmp;
    }
}

int main()
{
	int ret = 0;
	ret = Fibon2(8);
    printf("ret=%d", ret);
	return 0;
}

汇编
4: int Fibno2(int n){
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,50h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-50h]
0040102C mov ecx,14h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
5: int num1 = 1;
00401038 mov dword ptr [ebp-4],1
6: int num2 = 1;
0040103F mov dword ptr [ebp-8],1
7: int tmp = 0;
00401046 mov dword ptr [ebp-0Ch],0
8: int i = 0;
0040104D mov dword ptr [ebp-10h],0
9: if (n < 3){
00401054 cmp dword ptr [ebp+8],3
00401058 jge Fibno2+41h (00401061)
10: return 1;
0040105A mov eax,1
0040105F jmp Fibno2+78h (00401098)
11: }else{
12: for (i = 0; i <= n-3; i++){
00401061 mov dword ptr [ebp-10h],0
00401068 jmp Fibno2+53h (00401073)
0040106A mov eax,dword ptr [ebp-10h]
0040106D add eax,1
00401070 mov dword ptr [ebp-10h],eax
00401073 mov ecx,dword ptr [ebp+8]
00401076 sub ecx,3
00401079 cmp dword ptr [ebp-10h],ecx
0040107C jg Fibno2+75h (00401095)
13: tmp = num1 + num2;
0040107E mov edx,dword ptr [ebp-4]
00401081 add edx,dword ptr [ebp-8]
00401084 mov dword ptr [ebp-0Ch],edx
14: num1 = num2;
00401087 mov eax,dword ptr [ebp-8]
0040108A mov dword ptr [ebp-4],eax
15: num2 = tmp;
0040108D mov ecx,dword ptr [ebp-0Ch]
00401090 mov dword ptr [ebp-8],ecx
16: }
00401093 jmp Fibno2+4Ah (0040106a)
17: return tmp;
00401095 mov eax,dword ptr [ebp-0Ch]
18: }
19: }
00401098 pop edi
00401099 pop esi
0040109A pop ebx
0040109B mov esp,ebp
0040109D pop ebp
0040109E ret


21: int main()
22: {
004010C0 push ebp
004010C1 mov ebp,esp
004010C3 sub esp,44h
004010C6 push ebx
004010C7 push esi
004010C8 push edi
004010C9 lea edi,[ebp-44h]
004010CC mov ecx,11h
004010D1 mov eax,0CCCCCCCCh
004010D6 rep stos dword ptr [edi]
23: int ret = 0;
004010D8 mov dword ptr [ebp-4],0
24: ret = Fibno2(8);
004010DF push 8
004010E1 call @ILT+0(_Fibno2) (00401005)
004010E6 add esp,4
004010E9 mov dword ptr [ebp-4],eax
25: printf(“ret=%d”, ret);
004010EC mov eax,dword ptr [ebp-4]
004010EF push eax
004010F0 push offset string “ret=%d” (0042201c)
004010F5 call printf (00401130)
004010FA add esp,8
26: return 0;
004010FD xor eax,eax
27: }
004010FF pop edi
00401100 pop esi
00401101 pop ebx
00401102 add esp,44h
00401105 cmp ebp,esp
00401107 call __chkesp (004011b0)
0040110C mov esp,ebp
0040110E pop ebp
0040110F ret

2021/2/13

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值