递归函数里面的return详解

递归里面的return,因为不断的调用己身,每次调用都是运行一次函数,先看下面的例子。(引用这篇分而治之,一种著名的递归式问题解决方法。D&C(divide and conquer)_兴趣使然的1T的博客-CSDN博客)

递归函数里面的return详解_第1张图片

函数divide_area(1680, 640)返回了None, 预期应该是要返回方块的长,为什么会这样?

看看divide_area(1680, 640)的调用栈,给基线条件标上编号1

lenth:1680, width: 640
1.divide_area(1680, 640)  # 这一步是暂停状态
    
    # 不满足1,进入递归
    lenth:1040, width: 640
    2.divide_area(1040, 640)  # 这一步是暂停状态

        # 不满足1,进入递归
        lenth:640, width: 400
        3.divide_area(640, 400)  # 这一步是暂停状态
        
            # 不满足1,进入递归
            lenth:400, width: 240
            4.divide_area(400, 240)  # 这一步是暂停状态

                # 不满足1,进入递归
                lenth:240, width: 160
                5.divide_area(240, 160)  # 这一步是暂停状态

                    # 不满足1,进入递归
                    lenth:160, width: 80
                    6.divide_area(160, 80)

                        7.满足1,return 80 , 注意了注意了!!,这里return 80, 是return给                
                          6.divide_area(160, 80)这一步,但是divide_area(160, 80)走的是
                            else(递归条件),else这里调用函数divide_area(160, 80)没有返    
                            回!!!
                     8.return None给divide_area(240, 160),divide_area(160, 80)结束。
                
                 9.return None给divide_area(400, 240),divide_area(240, 160)结束。

             10.return None给divide_area(640, 400),divide_area(400, 240)结束。

        11.return None给divide_area(1040, 640),divide_area(640, 400)结束。

    12.return None给divide_area(1680, 1040),divide_area(1040, 640)结束。

13.divide_area(1680, 640)结束,return None
                    
    

回到最开始的代码,要返回方块的长,只需要在递归条件里,return 函数体

如下:

递归函数里面的return详解_第2张图片

每一次的函数调用都return,这样就把最里层的80,一层一层的return回去。 

总结:在递归里,每次调用己身都是独立的,如果有return,每一次的return是return给外面一层的函数,函数返回后,会执行上一个函数剩下的代码,即函数从最里面开始结束。

你可能感兴趣的:(算法--基于python,python,算法)