python使用递归,尾递归,循环三种方式实现斐波那契数列的案例

  介绍

小编给大家分享一下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-05

python使用递归,尾递归,循环三种方式实现斐波那契数列的案例