В настоящее время рассматривая предстоящий экзамен, и ему был дан этот вопрос практики, ответ 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"), сколько рекурсивных вызовов выполняется до завершения этой функции?
Спасибо!
Вы должны нарисовать это как дерево:
запутать ( 'раздражать'):
+- 'an' (half of annoy, rounded down)
| +- 'a'
| \- 'n'
\- 'noy'
+- 'n'
\- 'oy'
+- 'o'
\- 'y'
Там ваши восемь звонков.
Они называются так:
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.
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
.
Если вы измените код на
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
Надеюсь, этот код поможет вам понять
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'))