输出是100,但我不明白为什么

时间:2019-10-17 12:06:05

标签: python function recursion

输出为100,但我不明白为什么。有人可以深入了解此代码如何逐步工作。

def fun(n):
    if (n > 100):
        return n - 5
    return fun(fun(n+11))
print(fun(45)) 

2 个答案:

答案 0 :(得分:1)

分解代码。


def fun(n): 
    if (n > 100): 
        return n - 5 
    return fun(fun(n+11)) 
print(fun(45))
> n =45, n > 100 == False, return fun(fun(n + 11))
    > fun(45+11) == fun(56), n = 56, 56 > 11 == False, return fun(fun(n + 11))
        > fun(56+11), n = 67
           > fun(67+11), n = 78
               > fun(78+11), n = 89
                   > fun(89 + 11), n= 100
                       > fun(100+11), n = 111
                       > fun(111), n > 100 return 111 - 5
                   > fun(106), return 106 - 5
               > fun(101), return 101 - 5
           > fun(96), return fun(fun(96+11))
               > fun(107), return 107 - 5
               > fun(102), return 102 - 5
           > fun(97), return fun(fun(97+11))
               > 108 - 5
               > 103 - 5
            > fun(98)
                > 109 - 5
                > 104 - 5
             > fun(99)
                > 110 - 5
       > 105 - 5, return 100

这里是代码:

def fun(n, s):
    space = " " * s
    if (n > 100):
        print(f"{space} > return {n}-5={n-5}")
        return [n - 5, s - 3]
    print(f"{space} > return fun(fun({n} + 11))\n {space + '   '} > return fun(fun({n+11}))")
    return fun(*fun(n+11, s+3))

print(fun(45, 0))

答案 1 :(得分:0)

正如一些评论所指出的那样,您最好的机会是写下纸上正在发生的事情:

  • n小于100时,您将n加11,然后加深。
  • n大于100时,您返回n-5,然后升高。

如果要在纸上表示,每次加11时可以向下移动,每次减5时可以向上移动。超过起点时将得到结果。

START                                                100
 |                                                    ^
 V                                                    |

 45                                        99    99  105
 56                            98    98   104   110  110
 67                 97    97  103   109   109
 78     96    96   102   108  108
 89    101   107   107
 100   106
 111   111

由于您正在尝试双重递归,所以我想您已经熟悉递归了。如果没有,先看看there