介绍
小编给大家分享一下python使用递归,尾递归,循环三种方式实现斐波那契数列的案例,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
在最开始的时候所有的斐波那契代码都是使用递归的方式来写的,递归有很多的缺点,执行效率低下,浪费资源,还有可能会造成栈溢出,而递归的程序的优点也是很明显的,就是结构层次很清晰,易于理解
可以使用循环的方式来取代递归,当然也可以使用尾递归的方式来实现。
尾递归就是从最后开始计算,每递归一次就算出相应的结果,也就是说,函数调用出现在调用者函数的尾部,因为是尾部,所以根本没有必要去保存任何局部变量。直接让被调用的函数返回时越过调用者,返回到调用者的调用者去。尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数,深层函数所面对的不是越来越简单的问题,而是越来越复杂的问题,因为参数里带有前面若干步的运算路径。尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。直接递归的程序中需要保存之前n步操作的所有状态极其耗费资源,而尾递归不需要,尾部递归是一种编程技巧。如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次
为了加深对尾递归,递归和循环的对比,这里以斐波那契数列的实现举例:
# !/usr/bin env python , #编码:utf-8 ,,, & # 39;& # 39;& # 39;& # 39;& # 39;& # 39;& # 39;, __Author__:沂水寒城, 功能:尾递归, & # 39;& # 39;& # 39;,,, import time def Fib_recursion (num):, & # 39;才能& # 39;& # 39;& # 39;& # 39;, 直才能接使用递归法求解斐波那契数量的第num个数字, & # 39;才能& # 39;& # 39;, if 才能;num<2:, ,,return num , return 才能Fib_recursion (num-1) + Fib_recursion (num-2), , def Fib_tail_recursion (num res,临时):, & # 39;才能& # 39;& # 39;& # 39;& # 39;, 使才能用尾递归法求解斐波那契数量的第num个数字, & # 39;才能& # 39;& # 39;, if 才能;num==0:, ,,,return res , ,,: ,,,return Fib_tail_recursion (num-1,临时,res +临时),, def Fib_circle (num):, & # 39;才能& # 39;& # 39;& # 39;& # 39;, 直才能接使用循环来求解, & # 39;才能& # 39;& # 39;, 一个=0,才能 ,,b=1, for 才能小姐:范围(1,num):拷贝, ,,,c=a + b ,,,=b ,,,b=c , c return 才能; ,, if __name__ ==, & # 39; __main__ # 39;:, num_list才能=[5、10、20、30、40、50), for 才能;num  num_list:拷贝, ,,,start_time=time.time (), ,,,print Fib_recursion (num), ,,,end_time=time.time (), ,,,print Fib_tail_recursion (num 0 1), ,,,end_time2=time.time (), ,,,print Fib_circle (num), ,,,end_time3=time.time (), ,,,print & # 39;正在求解的斐波那契数字下标为% & # 39;,% num ,,,print & # 39;直接递归耗时为,:& # 39;,end_time-start_time ,,,print & # 39;尾递归调用耗时为:& # 39;,end_time2-end_time ,,,print & # 39;直接使用循环耗时为:& # 39;,end_time3-end_time2
结果如下:
5, 5, 5, 正在求解的斐波那契数字下标为5, 直接递归耗时为,:,6.38961791992 e-05 尾递归调用耗时为:,2.31266021729 e-05 直接使用循环耗时为:,1.97887420654 e-05 55, 55, 55, 正在求解的斐波那契数字下标为10, 直接递归耗时为,:,6.60419464111 e-05 尾递归调用耗时为:,3.31401824951 e-05 直接使用循环耗时为:,1.8835067749 e-05 6765年, 6765年, 6765年, 正在求解的斐波那契数字下标为20, 直接递归耗时为,:,0.00564002990723, 尾递归调用耗时为:,3.09944152832 e-05 直接使用循环耗时为:,2.09808349609 e-05 832040, 832040, 832040, 正在求解的斐波那契数字下标为30, 直接递归耗时为,:,0.39971113205, 尾递归调用耗时为:,1.69277191162 e-05 直接使用循环耗时为:,1.19209289551 e-05 102334155, 102334155, 102334155, 正在求解的斐波那契数字下标为40, 直接递归耗时为,:,39.0365440845, 尾递归调用耗时为:,2.19345092773 e-05 直接使用循环耗时为:,1.78813934326 e-05 12586269025, 12586269025, 12586269025, 正在求解的斐波那契数字下标为50, 直接递归耗时为,:,4915.68643498, 尾递归调用耗时为:,2.19345092773 e-05 直接使用循环耗时为:,2.09808349609 e-05python使用递归,尾递归,循环三种方式实现斐波那契数列的案例