Цикл while внутри вашей функции инициирует рекурсивный вызов, если он не может извлечь заголовок. Он работает, когда вы используете return fetch_data(link)
, так как всякий раз, когда счетчик меньше или равен 3 while counter<=3
, он сразу же завершает функцию в конце цикла while, таким образом, не спускаясь к нижней строке, которая будет сбрасывать счетчик. до 0 counter=0
. Поскольку счетчик является глобальной переменной и увеличивается только на 1 для каждой глубины рекурсии, у вас будет только максимум 4 глубины рекурсии, поскольку в любое время counter
больше 3, он не будет переходить в цикл while, который будет вызывать другой fetch_data(link)
.
fetch_data (counter=0)
--> fetch_data (counter=1)
--> fetch_data (counter=2)
--> fetch_data (counter=3)
--> fetch_data (counter=4)
- not go into while loop, reset counter, print url
- return to above function
- return to above function
- return to above function
- return to above function
Если вы используете fetch_data(link)
, функция все равно будет инициировать рекурсивный вызов в цикле while. Однако не выходите сразу и сбросите счетчик на 0. Это опасно, потому что после того, как ваш счетчик перейдет к 4, функция и возврат к циклу while предыдущего вызова функции внутри цикла while, цикл while не будет прерываться и продолжайте инициировать дополнительные рекурсивные вызовы, потому что счетчик в настоящее время установлен на 0, что составляет <= 3. Это в конечном итоге достигнет максимальной глубины рекурсии и приведет к сбою программы. </p>
fetch_data (counter=0)
--> fetch_data (counter=1)
--> fetch_data (counter=2)
--> fetch_data (counter=3)
--> fetch_data (counter=4)
- not go into while loop, !!!reset counter!!!, print url
- return to above function
- not return to above function call
- since counter = 0, continue the while loop
--> fetch_data (counter=1)
--> fetch_data (counter=2)
--> fetch_data (counter=3)
...