Python - Почему это делает 8 рекурсивных вызовов?

1

В настоящее время рассматривая предстоящий экзамен, и ему был дан этот вопрос практики, ответ 8, но я не уверен, почему. Может кто-то сломает это для меня? Я попытался проследить его, но он запутался быстро.

def confuse(s):     
   if len(s) <= 1:        
      return s     
   x = len(s) // 2     
   return confuse(s[:x]) + confuse(s[x:]) 

print(confuse('annoy')) 

Вопрос: Исключая вызов для путаницы ("annoy"), сколько рекурсивных вызовов выполняется до завершения этой функции?

Спасибо!

Теги:

5 ответов

8
Лучший ответ

Вы должны нарисовать это как дерево:

запутать ( 'раздражать'):

+- 'an' (half of annoy, rounded down)
|  +- 'a'
|  \- 'n'
\- 'noy'
   +- 'n'
   \- 'oy'
      +- 'o'
      \- 'y'

Там ваши восемь звонков.

  • 2
    Возможно, кто-то с лучшими навыками ascii art или какой-нибудь визуальный редактор может сделать это более красивым.
  • 0
    Я понял, что я глуп, я сделал неосторожную ошибку. Теперь я вижу, как это работает. Спасибо!
3

Они называются так:

confuse('annoy')
confuse('an') + confuse('noy')  # 5//2 = 2
confuse('a') + confuse('n') # 2//2 = 1
confuse('n') + confuse('oy') # 3//2 = 1
confuse('o') + confuse('y') # 2//2 = 1

Поэтому 8.

3
confuse('annoy') == confuse('an') + confuse('noy')
                 == confuse('a') + confuse('n') + confuse('n') + confuse('oy')
                 == 'a' + 'n' + 'n' + confuse('o') + confuse('y')
                 == 'a' + 'n' + 'n' + 'o' _ 'y'
                 == 'annoy'

Подсчитайте звонки, чтобы confuse RHS, и вы найдете 8 из них. Грубо говоря, вы получаете 2**O(lg(n)) рекурсивные вызовы для ввода длины n.

1

Если вы измените код на

def confuse(s):
   print("called with -->", s)
   if len(s) <= 1:        
      return s     
   x = len(s) // 2     
   return confuse(s[:x]) + confuse(s[x:]) 

confuse('annoy')

ты получишь

called with --> annoy
called with --> an
called with --> a
called with --> n
called with --> noy
called with --> n
called with --> oy
called with --> o
called with --> y

Исключая вызов для путаницы ("annoy"), сколько рекурсивных вызовов выполняется до завершения этой функции? 9 - 1 = 8

0

Надеюсь, этот код поможет вам понять

def confuse(s):     
   if len(s) <= 1:        
      return s     
   x = len(s) // 2
   print(s[:x], s[x:])
   return confuse(s[:x]) + confuse(s[x:]) 

print(confuse('annoy'))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню