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

    """
    """
    """
    
    一函数的递归
    函数在调用阶段直接或间接的又调用了自身
    如;
        def func(n):       func里面的值n
              print("from func",n) 打印fromfunc 还有n
              func(n+1)
        def func(1)         在这里func调用了上面的func且n+1陷入了死循环
                       如果启动 就会死机或者直接卡死但是python解释器害怕会发生这样的事情
                       从而做出的优化这个循环顶多在997 or 998 这两个数字左右 就会停止
    2 
        def index():
            print("from index")     第一个函数调用了第二个函数
            login()                 都在等一那一个结束但是 上面的函数调用了下面的函数login
                                    下面的函数在调用上面的函数index 所以结束不了从而造成死循环
                                    
        def login()
            print("from index")
            index()
        login()
    函数不该无限制的递归下去
    递归:  递归分为两个阶段
                1.回溯: 就是一次次的重复的过程,这个重复的过程
                        必须建立在每一次重复的问题的复杂度都会降下来
                2.递推: 一次次的往回推导的过程 
        例子
        我的面前站了五个人 我问第一个人,说你多大了 他说比后面的大两岁
        我然后问后面的 我问他,他说我也比后面的大两岁,我就这样重复的问问道
        最后一个人 那个人说他18岁   由此我可以推断   第四个人20 第三个人22 第二个人24第一个人= 26
    而 这个过程 就是递归  前面我问就等于回溯  后面我的推断知道了每个人的年纪 就是递推
        但是要把这个你心里想的话 要用程序写出来 就是下面的
        age(5) = age(4) + 2
        age(4) = age(3) + 2
        age(3) = age(2) + 2
        age(2) = age(1) + 2
        age(1) = 18
          既然知道了这个 过程 那么用函数的表达方式表达出来就行了
    age(n) = age(n-1)+2
    age(1) = 18        
    
    def age(n)            开始吧下面的age(5)的值给了n这时候n就等于5
        if n==1:          如果n==1的时候那么结束   
            return 18     return的返回值是18 吧18 返回给了age
        return age(n-1)+2 这里的返回n-1=4    再返回因为n!=1重复循环 
    res = age(5)          的结果是age=8  满足了n==1 返回值18 加上8 就等于26把这个值返回了age
    print(res)            然后用res接受了这个值 然后 print的结果就是26
    
    二
      将列表的中的数字一次循环打印出来  因为数字较多循环的层数是你必须要考虑的
        l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
         首先想到的是用for循环吧里面的数字取出来
          for i in l:             首先for循环吧列表里面的值拿出l  列表里面只有两个值
               if type(i) is int: 如果i是 整形那么打印 如果不是就不打印 从而筛选数来不至于吧每层中的列表打印出来
                    print(i)      第一个打印出来的是1然后继续
               else:
                    for item in i:  这时候 你就要考虑 像这个方式你就要重复的使用9次   如果这个列表里面有一万个数字
                         if type(item) is int:       那么你可能敲一天的代码  敲完了老板说 算了我就要50 那么又要删除好久  
                             print(item)             所以 太麻烦  从这 推断我们得到首先可以用函数因为重复的功能太多
    def get_num(l):  
        for i in l:            1,用for循环 吧l列表的值给i
            if type(i) is int: 2,如果i是 整形那么打印 如果不是就不打印 从而筛选数来不至于吧每层中的列表打印出来
                print(i)         第一个打印1 然后继续
            else:
                get_num(i)     1,如果不是就打印i这个列表然后返回接受的到的列表再次提取 再次循环 
    get_num(l)                 2,这时候吧循环出来的值                 
    l1 = []                     给了ll就等于i                                     
    for i in l1:               3,吧i的值 通过for循环 全部传入列表中    
        print(l1)              4,打印l1
        
        
         为什么这里没有erturn  因为列表的值是固定的会循环完 循环完了 就结束了
         所以不会陷入死循环中
        
    
    
    
    
    """
  • 相关阅读:
    HNUSTOJ-1675 Morse Code(DFS+字典序搜索)
    HNUSTOJ-1638 遍地桔子(贪心)
    HNUSTOJ-1521 塔防游戏
    HNUSTOJ-1565 Vampire Numbers(暴力打表)
    HDUSTOJ-1559 Vive la Difference!(简单题)
    HDUSTOJ-1558 Flooring Tiles(反素数)
    HNUSTOJ-1600 BCD时钟
    胡雪岩04
    新概念4-24
    曾国藩家训02
  • 原文地址:https://www.cnblogs.com/yangxinpython/p/11176877.html
Copyright © 2011-2022 走看看