c语言fib函数直接用吗,C语言编程第26讲——不断优化,得到菲波那契函数非递归实现算法...

75be2830af152c802b6790a637cc49ba.png

1、菲波那契函数描述

5673c23a35dc11eb43c9b5b7f3480271.png

菲波那契函数,英文名叫Fibonacci,是用分段函数的方式定义的:

8f2b140af9e62de784ca195072774ebf.png

2、函数的递归实现

菲波那契函数的递归实现比较简单,我在《C语言程序设计——递归函数》中给出了源代码实现,这里就不列出了。

3、函数非递归实现第一步优化——用数组保存中间结果

使用递归实现,程序运行时最大的开销在于函数调用,需要利用栈保存函数调用前的上下文。

如果我们用数组来模拟递归调用,数组中的每个元素保存某个递归函数调用的结果,可以极大提高运行效率。

程序的代码如下:

42d4e7419c4f597422e2ebc45693403f.png

上面程序编译之后运行的结果如下:

fib(0) = 0fib(1) = 1fib(2) = 1fib(3) = 2fib(4) = 3fib(5) = 5fib(6) = 8fib(7) = 13fib(8) = 21fib(9) = 34fib(10) = 55fib(11) = 89fib(12) = 144fib(13) = 233fib(14) = 377fib(15) = 610fib(16) = 987fib(17) = 1597fib(18) = 2584fib(19) = 4181

4、函数非递归实现第二步优化——去掉动态内存申请与释放

上面的非递归函数实现,还有一个小问题,就是每次执行fib函数,都要申请和释放内存,对性能还是有一定的影响。

这次,我们对代码继续优化一下,不再使用数组保存中间数据。

源代码如下:

728cbda6d58377a3f21ba6f52ca84ef0.png

源代码中有个小技巧,就是通过数学计算,只使用了iResult和iPrev两个变量,实现了下一组中间结果的计算。

程序编译后运行的结果是:

fib(0) = 0fib(1) = 1fib(2) = 1fib(3) = 2fib(4) = 3fib(5) = 5fib(6) = 8fib(7) = 13fib(8) = 21fib(9) = 34fib(10) = 55fib(11) = 89fib(12) = 144fib(13) = 233fib(14) = 377fib(15) = 610fib(16) = 987fib(17) = 1597fib(18) = 2584fib(19) = 4181

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值