输出为100,但我不明白为什么。有人可以深入了解此代码如何逐步工作。
def fun(n):
if (n > 100):
return n - 5
return fun(fun(n+11))
print(fun(45))
答案 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!