zoukankan      html  css  js  c++  java
  • python 递归函数

    前言:本篇关于递归基本借鉴下面博客讲解加入自己理解。

    http://www.cnblogs.com/alex3714/articles/5740985.html)

    1.递归函数定义

    如果一个函数在函数内部调用自己,那这个函数就是递归函数。如:

    def sum(arg,stop):
        print(arg)
        if arg<stop:
            arg+=arg
            sum(arg,stop)
    
    sum(1,20)

    2.递归的特性

    1) 必须有一个明确的结束条件,不然进入了死循环。

    2) 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3) 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    如把上例中return返回值,返回的是最初的栈值:

     1 def sum(arg,stop):
     2     print(arg)
     3     if arg<stop:
     4         arg+=arg
     5         sum(arg,stop)
     6     return arg
     7 
     8 print(sum(1,20))
     9 
    10 #运行结果
    11 1
    12 2
    13 4
    14 8
    15 16
    16 32
    17 2          #返回值一层一层返回arg的值,最后返回最初的栈值
    demo

    3.应用递归获取斐波那契数列

    斐波那契数列是指前两个数加起组成第三个数规律的一组数列,如:0,1,1,2,3,5,8,13.

     1 def func(arg1,arg2,stop):
     2     if arg1==0:
     3         print(arg1,arg2)
     4     arg3 =arg1+arg2
     5     print(arg3)
     6     if arg3<stop:
     7         func(arg2,arg3,stop)
     8 
     9 func(0,1,10)
    10 
    11 #运行结果
    12 0 1
    13 1
    14 2
    15 3
    16 5
    17 8
    18 13
    demo

    4.应用递归实现二分法查找

    当数据量很大时查找,适宜采用二分法。采用二分法查找时,数据需是排好序的,取中间值与查找值比较而取舍一半数据,这样可以缩减查找时间。

     1 def binary_search(data_source,find_n):
     2     mid=int(len(data_source)/2)
     3     if len(data_source)>1:
     4         if data_source[mid] > find_n:    #data in left
     5             print('data in left of [%s]'%data_source[mid])
     6             binary_search(data_source[:mid],find_n)
     7         elif data_source[mid] < find_n:    #data in right
     8             print('data in left of [%s]'%data_source[mid])
     9             binary_search(data_source[mid:],find_n)
    10         else:
    11             print('found find_s:',data_source[mid])
    12     else:
    13         print('cannot find ....')
    14 
    15 if __name__=='__main__':
    16     data = list(range(1,50000))
    17     binary_search(data,36378)
    18 
    19 #运行结果
    20 data in left of [25000]
    21 data in left of [37500]
    22 data in left of [31250]
    23 data in left of [34375]
    24 data in left of [35937]
    25 data in left of [36718]
    26 data in left of [36327]
    27 data in left of [36522]
    28 data in left of [36424]
    29 data in left of [36375]
    30 data in left of [36399]
    31 data in left of [36387]
    32 data in left of [36381]
    33 found find_s: 36378
    demo
  • 相关阅读:
    1002 写出这个数
    1001 害死人不偿命的(3n+1)猜想
    Graph I
    Tree
    进程通信
    管道
    fork函数
    Priority Queue
    Search
    游戏 slider
  • 原文地址:https://www.cnblogs.com/olivexiao/p/6734765.html
Copyright © 2011-2022 走看看