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

    递归

    1.什么是递归 recursion 递归

          递归的定义——在一个函数里再调用这个函数本身

          在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

          递归的最大深度——997

        一个函数在内部调用自己

         递归的层数在python里是有限制的 997/998层

    2.层数可以修改 sys模块

     1 import sys  #python限制在997/998
     2 sys.setrecursionlimit(10000000)  #可以修改
     3 COUNT = 0
     4 def func():  #recursion 递归
     5     global COUNT
     6     COUNT += 1
     7     print(COUNT)
     8     func()
     9 
    10 func()
    View Code

    3.解耦

    要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数分离
    1.增强代码的重用性
    2.减少代码变更的相互影响

    4.实例一,求年龄
     1 #写递归函数必须要有一个结束条件
     2 #alex
     3 #1 alex egon + 2   n=1  age(1) = age(2) + 2
     4 #2 egon wusir + 2  n=2  age(2) = age(3) +2
     5 #3 wusir 金鑫 + 2  n=3  age(3) = age(4) +2
     6 #4 金鑫 40         n=4  age(4) = 40
     7 
     8 def age(n):
     9     if n == 4:
    10         return 40
    11     return age(n+1)+2
    12 
    13 # age(1)   #46
    14 # def age(1):
    15 #     return 46
    16 # 
    17 # def age(2):
    18 #     return 44
    19 # 
    20 # def age(3):
    21 #     return 42
    22 # 
    23 # def age(4):
    24 #     if 4 == 4:
    25 #         return 40
    26 
    27 复制代码
    View Code

    5.实例二,求阶乘

     1 #求阶乘 n = 7  7*6*5*4*3*2*1
     2 def func(n):
     3     if n == 1:
     4         return 1
     5     else:
     6         return n*func(n-1)
     7 
     8 ret = func(4)
     9 print(ret)
    10 
    11 # #n = 4
    12 # def func(4):
    13 #     return 4*6
    14 #
    15 # #n = 3
    16 # def func(3):
    17 #     return 6
    18 #
    19 # #n = 2
    20 # def func(2):
    21 #         return 2
    22 #
    23 # #n = 1
    24 # def func(n):
    25 #     if n == 1:
    26 #         return 1
    View Code

    6.实例三,二分查找

     1 #算法  计算的方法
     2 def search(num,l,start=None,end=None):
     3     start = start if start else 0
     4     end = end if end else len(l) - 1
     5     mid = (end - start)//2 + start    #这里要加上开始的索引
     6     if start > end:   #如果差找不到返回None
     7         return None
     8     elif l[mid] > num :   #17,17
     9         return search(num,l,start,mid-1)
    10     elif l[mid] < num:
    11         return search(num,l,mid+1,end)
    12     elif l[mid] == num:
    13         return mid
    14 
    15 
    16 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    17 print(search(66,l))
    18 
    19 def search(num,l,start=None,end=None): #66,[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    20     start = start if start else 0      #start = 0
    21     end = end if end else len(l) - 1   #end = 24
    22     mid = (end - start)//2 + start     #mid = 12
    23     if l[mid] > num :                  #l[mid] = 41  <  66
    24         search(num,l,start,mid-1)
    25     elif l[mid] < num:
    26         ret = search(num,l,mid+1,end)        #search(66,l,13,24)
    27         return ret
    28     elif l[mid] == num:
    29         return mid, l[mid]
    30 
    31 def search(num,l,start=None,end=None): #66,[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    32     start = start if start else 0      #start = 13
    33     end = end if end else len(l) - 1   #end = 24
    34     mid = (end - start)//2 + start     #mid = 18
    35     if l[mid] > num :                  #l[mid] = 67  >  66
    36         search(num,l,start,mid-1)      #search(66,l,13,17)
    37     elif l[mid] < num:
    38         ret = search(num,l,mid+1,end)
    39         return ret
    40     elif l[mid] == num:
    41         return mid, l[mid]
    42 
    43 def search(num,l,start=None,end=None): #66,[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    44     start = start if start else 0      #start = 13
    45     end = end if end else len(l) - 1   #end = 17
    46     mid = (end - start)//2 + start     #mid = 15
    47     if l[mid] > num :                  #l[mid] = 56  <  66
    48         search(num,l,start,mid-1)
    49     elif l[mid] < num:
    50         ret = search(num,l,mid+1,end)        #search(66,l,16,17)
    51         return ret
    52     elif l[mid] == num:
    53         return mid, l[mid]
    54 
    55 def search(num,l,start=None,end=None): #66,[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    56     start = start if start else 0      #start = 16
    57     end = end if end else len(l) - 1   #end = 17
    58     mid = (end - start)//2 + start     #mid = 16
    59     if l[mid] > num :                  #l[mid] = 56  <  66
    60         search(num,l,start,mid-1)
    61     elif l[mid] < num:
    62         ret = search(num,l,mid+1,end)        #search(66,l,17,17)
    63         return ret
    64     elif l[mid] == num:
    65         return mid, l[mid]
    66 
    67 def search(num,l,start=None,end=None): #66,[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    68     start = start if start else 0      #start = 17
    69     end = end if end else len(l) - 1   #end = 17
    70     mid = (end - start)//2 + start     #mid = 17
    71     if l[mid] > num :                  #l[mid] = 66  ==  66
    72         search(num,l,start,mid-1)
    73     elif l[mid] < num:
    74         search(num,l,mid+1,end)
    75     elif l[mid] == num:
    76         return mid, l[mid]               #return 17,66
    View Code

    7实例四,斐波那契数列

     1 #斐波那契
     2 #1,1,2,3,5,8
     3 def fib(n):
     4     if n==1 or n==2:
     5         return 1
     6     return fib(n-1) + fib(n-2)
     7 
     8 # print(fib(6))
     9 
    10 # def fib(6):
    11 #     return 5 + 3
    12 #
    13 # def fib(5):
    14 #     return 5
    15 #
    16 # def fib(4):
    17 #     return 3
    18 #
    19 # def fib(3):
    20 #     return 2
    21 #
    22 # def fib(2):
    23 #     if n==1 or n==2:
    24 #         return 1
    25 #
    26 # def fib(1):
    27 #     if n == 1 or n == 2:
    28 #         return 1
    View Code

    8.实例五,面试真题

     1 #面试真题
     2 
     3 # 有⼀个数据结构如下所示,请编写⼀个函数从该结构数据中返回由指定的字段和对应的值组成的字典。如果指定字段不存在,则跳过该字段。(10分)
     4 data={"time":"2016-08-05T13:13:05",
     5     "some_id":"ID1234",
     6     "grp1":{ "fld1":1,"fld2":2},
     7     "xxx2":{ "fld3":0,"fld5":0.4},
     8     "fld6":11,
     9     "fld7":7,
    10     "fld46":8}
    11 #fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19
    12 
    13 def select(data,fields,result = {}):  #这里默认参数创建一个空字典,利用了默认参数可变类型的陷阱,修改字典始终修改的是一个字典
    14     field_lst = fields.split('|')
    15     for key in data:
    16         if key in field_lst:
    17             result[key] = data[key]
    18         elif type(data[key]) == dict:
    19             select(data[key], fields)
    20     return result
    21 
    22 fields = 'fld2|fld3|fld7|fld19'
    23 ret = select(data,fields)
    24 print(ret)
    25 
    26 
    27 #方法二
    28 def select(data,fields):
    29     result = {}
    30     field_lst = fields.split('|')
    31     for key in data:
    32         if key in field_lst:
    33             result[key] = data[key]
    34         elif type(data[key]) == dict:
    35             res = select(data[key],fields)
    36             result.update(res)
    37     return result
    View Code

    9.实例六,三级菜单

     1 #3.三级菜单
     2 menu = {
     3     '北京': {
     4         '海淀': {
     5             '五道口': {
     6                 'soho': {},
     7                 '网易': {},
     8                 'google': {}
     9             },
    10             '中关村': {
    11                 '爱奇艺': {},
    12                 '汽车之家': {},
    13                 'youku': {},
    14             },
    15             '上地': {
    16                 '百度': {},
    17             },
    18         },
    19         '昌平': {
    20             '沙河': {
    21                 '老男孩': {},
    22                 '北航': {},
    23             },
    24             '天通苑': {},
    25             '回龙观': {},
    26         },
    27         '朝阳': {},
    28         '东城': {},
    29     },
    30     '上海': {
    31         '闵行': {
    32             "人民广场": {
    33                 '炸鸡店': {}
    34             }
    35         },
    36         '闸北': {
    37             '火车战': {
    38                 '携程': {}
    39             }
    40         },
    41         '浦东': {},
    42     },
    43     '山东': {},
    44 }
    45 # 相同的数据类型 嵌套在一起
    46 def Three_Level_Menu(menu):
    47     while True:
    48         for k in menu:print(k)
    49         key = input('>>>')
    50         if key == 'q':return 'q'   #到最上层接收的q,遇到return结束,返回q有没有人接收都没关系
    51         elif key == 'b':break  #如果输入b,跳出本层循环
    52         elif key in menu:
    53             ret = Three_Level_Menu(menu[key])
    54             if ret == 'q': return 'q'    #如果接收到的是q,也往上返回一个q
    55 Three_Level_Menu(menu)
    View Code
  • 相关阅读:
    第k短路
    Codeforces Round #608 (Div. 2)
    Codeforces Round #606 E(无向图求pair(x,y)x到y的任意路径一定经过定点a和b的数量)
    Codeforces Round #603 (Div. 2)E
    题解报告:hdu 2717 Catch That Cow(bfs)
    题解报告:poj 3669 Meteor Shower(bfs)
    题解报告:poj 1321 棋盘问题(dfs)
    题解报告:hdu 1312 Red and Black(简单dfs)
    题解报告:poj 1426 Find The Multiple(bfs、dfs)
    hdu 4704 Sum(扩展欧拉定理)
  • 原文地址:https://www.cnblogs.com/panfb/p/7810925.html
Copyright © 2011-2022 走看看