四种C语言不用指针的方式实现斐波那契数列

  斐波那契数列是数学家斐波那契以研究兔子繁殖为例的数列,故称“兔子数列”,又称为黄金分割数列。

  这里以一道题目引入:

  一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月就能生出一对小兔子。假设一开始有一对刚出生的兔子,且接下来所有兔子都不死,那么一年以后可以繁殖多少对兔子?

  输入月数小于或等于0时输出num=0;

  输入月数为1或2时输出num=1;

  解析一下,刚出生的小兔叽还没有生育能力,要等到两个月之后这两对小兔叽才可以生宝宝,所以前两个月兔子的个数始终为2,但这题目要求输出1,所以到时候我们在斐波那契的基础上要乘个2。兔子每个月的个数如下:

  2 2 4 6 10 16 26 42 68 110 178 288(所以第12个月我们得到288只兔子,最终结果输出)

  由上述可看出第三个月兔子总数为第一个月和第二个月之和(2+2),第四个月为(2+4),以此类推下去......这就是斐波那契数列,一个线性递推的数列。

接下来我们解题提供了四种不用指针的C语言实现方法:

方法一:递归调用

解析:递归调用

  设置了一个函数fib,这个函数fib的参数是一个整形n,其中进行了题目中的判断,1,2月份返回1;月份小于或等于0时返回0。并且反复套用fib函数进行求解,分别求得为:1 1 2 3 5 8 13 21 34......这是斐波那契数列的标准形式,我们小兔叽每次可以生出一对,也就是两个小兔叽,那么是这个标准的两倍,所以我们在主函数中乘上了一个2,用于表示两倍。也就是——2*fib(n)

  注意:这里有两个易错点:

【1】最后return的是fib(n-1)+fib(n-2),也就是fib(n)=fib(n-1)+fib(n-2),n代表的是目前的月份,n-1代表的是之前的一个月份,n-2代表的是之前更前的一个月份。

【2】注意不要写错成这样:这里不在主函数中乘2,而是把fib函数的return值乘2,但是要注意,这是递归调用!!!,这样的写法相当于每次递归调用fib函数时都要乘2,变为了增长地更快的另一个函数了。

方法二:非递归调用

  

解析:非递归调用

  这里没有像之前递归调用一样引用函数,而是直接用循环一步一步赋值,f1,f2,f3三个只是中间变量,随时变化,首先将第一项和第二项的值加起来赋给第三项,用f3暂时代为存储;然后将第二项的值放入f1中,将第三项的值放入f2之中,再将第二项和第三项的值加起来赋给第四项,用f3暂时代为存储,这样不断循环,f1,f2,f3的作用只是暂时存储数据,f3暂时存储这一次循环所要求的数据,f1代表这个数据的前前项,f2代表这个数据的前一项,f3求出后,再递进一位,以此类推......

  注意:该方法中的for循环是从第三项开始进行的,所以n=3。

方法三:数组

解析:数组

这里也设置了函数fib,函数内数组a[]我们先赋了前两个值a[0]和a[1],随后循环相加。

注意:我们这里的i=2代表的是第三项(因为数组的第一项是0),后面的返回a[i-2]的原因是我们用的是for循环,最后一次未执行的循环中i还是加了1,所以从数组特性和for循环特性来讲我们i-2。(也可以用while循环会好很多,这样就直接返回n或者i-1了)

ps:i-2也等于n-1,n-1表示的更直白

方法四:无方法,运用规律

解析:无方法,运用规律

  这里也没有引用函数,而是直接通过斐波那契数列的运算规律求解,这里将一项拆分成了两个部分,一个部分是原来的num,另一个部分是x。

  这里的num=num+x中将第一个num看作是现在要求的该项的值,而后面的这个num指的是之前还未赋值的前一项,就像第三项是由第一项和第二项共同构成的,这里前一个的num就相当于第三项,正在赋值,而后面的num就相当于第二项,这个x就相当于第一项。

  而后面的x=num-x就相当于将第三项减去第一项,就是第二项。每次运算完num后都减去前前一项的值,就是x,中间值,之前的x舍去,进行下一轮循环,相加进入下一项求和运算,再舍去,以此类推......

注意:这里的i=1,i<=2指的是从第三项开始,前两项忽略。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值