首页 > 其他分享 >求第n个斐波那契数。(用递归和循环的方法对比)

求第n个斐波那契数。(用递归和循环的方法对比)

时间:2023-01-03 23:01:10浏览次数:45  
标签:契数 return 递归 int 个斐波 ret Fib

写这个代码的过程中出现的问题及改进方法:

  1. 用递归实现
#include <stdio.h>

int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
return 0;
}

写好代码运行发现的问题:不考虑结果溢出的情况下,当所求n较大时,代码运行次数太多,导致n以前的数重复的计算了很多次。我试了一下当n=50时,运行大约要十来分钟才能出结果。现在计算一下当计算第n个斐波那契数时,n之前的数执行次数。

用以下代码计算小于n的一个数的执行次数:

求第n个斐波那契数。(用递归和循环的方法对比)_求第n个斐波那契数


求第n个斐波那契数。(用递归和循环的方法对比)_递归_02

       用以上代码计算第n个斐波那契数时,通过递归函数代码运算得到3的次数如下图,为count=39088169次(运行时也等了一会儿),就一个3就重复了这么多次,还有小于n的其它数,所以用递归求第n个斐波那契数效率很低。由此可以看出,这题使用递归的方法对于计算机执行程序来说比较繁琐,求一个数重复运行多次,当n较大时问题会明显看出问题。

求第n个斐波那契数。(用递归和循环的方法对比)_循环_03

2.用循环实现(可以使以上问题得到改善)

#include <stdio.h>

int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}

int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
return 0;
}

由以上可以看出,用递归求此题的代码运算效率低,当n较大时问题比较明显;换成用循环求解可以使该问题得到解决。

标签:契数,return,递归,int,个斐波,ret,Fib
From: https://blog.51cto.com/u_15925085/5986882

相关文章

  • 1、尾递归及优化 ,例:斐波那契数列 2、递归转循环,蹦床函数
    1、函数调用自身,即为递归,在return时调用自身,即为尾递归;递归非常消耗内存,其原因是需要同时保存成成百上千的调用帧,这容易发生栈溢出错误;但是尾递归只存在一个调用帧,所以永......
  • 简单聊聊:递归,缓存,分治,回溯
    一、初识递归递归函数=终止条件+递归关系终止条件:当大问题被拆解成能轻松解决的小问题时,运行终止条件中的逻辑递归关系:定义如何将大问题拆解为小问题例子:小名跑步。......
  • 算法基础之全排列(递归)
    全排列(递归)全排列就是从第一个数字起每个数字分别与他后面的数进行交换。去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。全排列(不去重)//搜索/......
  • 函数和递归
    函数是什么库函数自定义函数函数参数函数调用函数的嵌套调用和链式访问函数的声明和定义函数递归函数是什么?维基百科定义:子程序在计算机科学中,子程序是一个大型程序中的部分......
  • 递归算法
    一、递归实现N!.代码实现:packagecn.test;/***@author徐庶*@date2016年9月6日*/publicclassRecursive{//递归privatestaticlongfactorial(intn){if(n......
  • 关于递归Collapse 折叠面板和实现分层折叠互斥效果
    近期要用Collapse折叠面板实现一个递归效果,直接上效果图,实现最终效果是每一层的内容互斥,组件递归的的时候为了实现每一层内容互斥要给每一个el-collapse加上一个v-model,......
  • 程序:用递归法计算字符串长度
    #include<stdio.h>intmy_strlen(char*str){if(*str!='\0')return1+my_strlen(str+1);elsereturn0;}intmain(){intret=0;chararr[]="hibi......
  • 程序:用递归法依次打印1234数字
    #include<stdio.h>voidprint(inta){if(a>9){print(a/10);}printf("%d",a%10);}intmain(){inta=1234;print(a);return0;}......
  • C语言--函数2--递归2
    递归--判断一个一维数组是否递增#include<stdio.h>#defineN5//判断一个一维数组是否递增/*Judge_dz:判断一个一维数组是否递增@a:一维数组名@n:元素个数返回值:无*......
  • 掌握二叉搜索树的双指针 + 公共祖先加深对后序遍历和递归的理解
    530.二叉搜索树的最小绝对差intmin=Integer.MAX_VALUE;TreeNodepre;/***<Ahref="https://leetcode.cn/problems/minimum-absolute-difference-in-......