C语言:斐波那契数列

本文讨论了在Visual Studio(VS)环境下遇到的编译问题,特别是对于C标准函数如scanf的不兼容性。作者提出了两种解决方法,包括禁用安全警告和修改项目属性。同时,文章介绍了递归和循环实现斐波那契数列的优缺点,强调了递归实现可能导致的效率低下和重复计算问题,并推荐使用循环实现以提高效率。
摘要由CSDN通过智能技术生成

 准备工作:

我选择的开发环境是VS,VS有很多优点。比如:代码高亮、语法自动缩进等等。但有时候C的标准语法,VS会编译失败,因为VS没有严格遵循C标准,比如scanf等等。

如图,想要对m重新赋值,语法是没有问题的。但是VS编译器认为scanf函数不安全,建议VS提供的scanf_s函数。

使用VS提供的scanf_s确实成功运行了,但是这样代码就缺少了跨平台性。我们,建议不使用VS提供的安全函数。解决方法有两种:

第一种,在程序的第一行输入:#define  _CRT_SECURE_NO_WARNINGS 1 //取消错误

第二种,在源文件属性中,将 SDL检查改为否(没有成功的原因,改了pro项目,没有改源文件,我这里显示的是test.c)  //可能会报警告,但是程序可以成功运行

 斐波那契数列(递归实现):

斐波那契数列的实现在编程中属于典型的问题,也就是兔子数列,右面数的值等于前两位的和,默认第一位和第二位为1。前面几位的值为:1、1、2、3、5、8、13、21、34....用数学表达式为f(n)=f(n-1)+f(n-2)。用递归很好实现思路:

1.用函数实现,定义m变量手动输入斐波那契数列的第m位,传给Fib函数

2.因为Fib函数需要返回第m位的斐波那契数列值,所有返回值为int类型

3.关于Fib函数的实现。因为递归要满足两个条件,第一是递归要设置出口,否则递归会陷入死循环。这里因为斐波那契数列的前两位值为1,所以我们这里设置出口在m<=2时,返回1。第二是递归要满足每次都要逼近设置的出口,否则也会陷入死循环。这里根据斐波那契数列的数学表达式可以很简单实现递归。

如图: 

这里存在两个问题,第一因为函数每次都要算出前面两个的值,所以前面的数字会被重复很多次运算,比如在我们计算第30个斐波那契数的时候,递归会计算29,28,在计算29的时候,又会计算28,27,另一个递归的28,又会计算27,26。

测试:在算第30个斐波那契数的时候,第3个斐波那契数已经被运算了30多万次。

这不仅仅是运算结果慢的问题,由于重复的运算,这就导致了第二个问题,在运算很大的斐波那契数的时候要等很长时间电脑才能计算出来。

 斐波那契数列(循环实现):

通过对递归问题的分析,每次计算斐波那契数的时候,都会对前面两个数进行操作,那不妨我们将前面两个结果的值存在变量里,用while循环进行计算:

将前面两个的结果存放在a,b中,然后用变量c对前面两个数进行求和。再将后面的值b赋给新的a,将上一轮的结果c赋值给b,这样就可以求出下一个斐波那契数。 通过m输入的值做循环变量需要计算几次,最后将c的结果返回。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵星人监护人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值