zoukankan      html  css  js  c++  java
  • python全栈开发从入门到放弃之递归函数的调用

    1.递归效率低,需要在进入下一次递归时保留当前的状态,见51cto博客

    解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自动
    但是python又没有尾递归,且对递归层级做了限制

    必须有一个明确的结束条件

    2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种)
    尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

     什么叫递归:

    递归函数,在一个函数内调用自己
    最大递归层数做了一个限制:997

    最大层数限制是python默认的,可以做修改

    但是不建议修改因为会占用电脑的内存

    #猜alex的年龄
    #alex比egon大两岁 alex = egon + 2
    #egon比wuSir大两岁 egon = wusir + 2
    #wusir比nezha大两岁 wusir = nezha + 2
    #nezha比金鑫大两岁 金鑫 + 2
    #金鑫40了

    # 1.金鑫 age(1) = 40
    # 2.哪吒 age(1) + 2
    # 3.wusir age(2) + 2
    # 4.egon age(3) + 2
    # 5.alex age(4) + 2

     1 def age(n):
     2     if n == 1:
     3         return 40     
     4     else:
     5         ret = age(n-1)   #先递推后递归 
     6         return ret + 2
     7 ret=age(5)
     8 print(ret)
     9 
    10 48
    #结束递归的标志:return

    递归实现三级菜单

     1 menu = {
     2     '北京': {
     3         '海淀': {
     4             '五道口': {
     5                 'soho': {},
     6                 '网易': {},
     7                 'google': {}
     8             },
     9             '中关村': {
    10                 '爱奇艺': {},
    11                 '汽车之家': {},
    12                 'youku': {},
    13             },
    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 threeLM(menu):
    47     for i in menu:
    48         print(i)
    49     key = input("please input name:")
    50     if key in menu:
    51         threeLM(menu[key])
    52 
    53 
    54 
    55 threeLM(menu)

    递归二分算法

     1 如果一个数 可以整除2 就整除
     2 不能整除就*3+1
     3 def func(num):
     4     print(num)
     5     if num == 1:
     6         return
     7     if num %2 == 0:
     8         num = num //2
     9     else:
    10         num = num * 3 + 1
    11     func(num)
    12 
    13 func(5)
    14 
    15 输出结果:
     1 l = [2,3,5,10,15,16,18,22,26]
     2 def find(l,aim): #l:列表 aim:要找的
     3     mid = len(l)//2  #计算中点
     4     if l[mid] > aim: #判断中间位置的值和目标值的大小关系
     5         new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
     6         return find(new_l,aim)
     7     elif l[mid] < aim:#判断中间位置的值和目标值的大小关系
     8         new_l = l[mid+1:]
     9         return find(new_l,aim)
    10     else:
    11         return l[mid]
    12 print(find(l,16))
    13 
    14 
    15 16
    别想一下造出大海,必须先由小河川开始。
  • 相关阅读:
    Leetcode#117 Populating Next Right Pointers in Each Node II
    Leetcode#123 Best Time to Buy and Sell Stock III
    获取文件大小的方法
    内存映射
    git patch
    git cherry-pick
    关于extern的说明
    Linux如何查看与/dev/input目录下的event对应的设备
    如何在Linux下统计高速网络中的流量
    [: ==: unary operator expected 解决方法
  • 原文地址:https://www.cnblogs.com/zcfx/p/7265432.html
Copyright © 2011-2022 走看看