Выход 100, но я не понимаю, почему - PullRequest
0 голосов
/ 17 октября 2019

Выход 100, но я не понимаю, почему. Может кто-нибудь дать представление о том, как этот код работает шаг за шагом.

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

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Разложите ваш код.


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))
0 голосов
/ 17 октября 2019

Как отмечалось в некоторых комментариях, ваш лучший шанс - записать, что происходит на бумаге:

  • Когда n меньше 100, вы добавляете 11 к n и иди глубже.
  • Когда n больше 100, вы возвращаете n-5 и идете выше.

Если вы хотите представить это на бумаге, вы можете понижаться каждый раз, когда вы прибавляете 11, и возвращаться вверх каждый раз, когда вы вычитаете 5. Вы получите свой результат, когда превзойдете исходную точку, переходяup.

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

Поскольку вы экспериментируете с двойной рекурсией, я полагаю, вы уже знакомы с рекурсией;если нет, то посмотрите там сначала!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...