1、菲波那契函数描述
菲波那契函数,英文名叫Fibonacci,是用分段函数的方式定义的:
2、函数的递归实现
菲波那契函数的递归实现比较简单,我在《C语言程序设计——递归函数》中给出了源代码实现,这里就不列出了。
3、函数非递归实现第一步优化——用数组保存中间结果
使用递归实现,程序运行时最大的开销在于函数调用,需要利用栈保存函数调用前的上下文。
如果我们用数组来模拟递归调用,数组中的每个元素保存某个递归函数调用的结果,可以极大提高运行效率。
程序的代码如下:
上面程序编译之后运行的结果如下:
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函数,都要申请和释放内存,对性能还是有一定的影响。
这次,我们对代码继续优化一下,不再使用数组保存中间数据。
源代码如下:
源代码中有个小技巧,就是通过数学计算,只使用了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