Вопросы о курсе рекурсивных функций Python

После неудачной установки вам необходимо отремонтировать перераспределители vc 2015 года и перезапустить установщик визуальной студии.

Распространяемый установщик перепутался, он смешивает 64-битную и 32-разрядную DLL-файлы. Вы можете проверить, есть ли у вас эта проблема, посмотрев размер файла vcruntime140.dll. Поиск в папке Windows для vcruntime140 вы должны увидеть 4 файла (64 и 32 бит в обеих версиях выпуска и отладки). Если какие-либо файлы имеют одинаковый размер, вам нужно запустить ремонт на распространяемом.

В моей системе 32-разрядная dll имеет 83,3KB, 64 бит - 86,6KB (версии выпуска).

0
задан yosen 27 March 2019 в 08:42
поделиться

1 ответ

Представьте себе:

result = []
pick(7, result, 4)

Этот код делает то, что при первом вызове он устанавливает ваше наименьшее число равным 0. Итак, в этот момент у вас есть smallest=0, n=7, to_pick=4. С этого момента у вас будет:

1- Ваш код входит в цикл, ваш пустой список будет добавлять наименьшее значение.

2- После этого функция будет вызываться рекурсивно, на этот раз ваше значение to_picked уменьшилось на единицу.

3- Ваше текущее наименьшее значение будет предыдущим наименьшим + 1, и снова вы перейдете ко 2-й строке.

4- После того, как вы достигнете конечного условия, ваш список будет напечатан. Первый раз будет [0,1,2,3]. Вы вернетесь из последней рекурсивной функции и перейдете к следующей строке.

5- На этот раз всплывет последний элемент. Итак, ваш список будет [0,1,2].

6- Вы идете на шаг дальше в цикле, на этот раз ваше следующее значение будет наименьшим + 1, а наименьшее значение было 3. Это будет добавлено, поэтому ваш список будет [0,1 , 2,4].

Редактировать: поэтому я обнаружил, что ваша главная проблема в том, что вы не можете понять, как return работает в рекурсивных функциях. Представьте, что у вас есть нерекурсивные функции, подобные этим:

def foo(A):
   return A
def bar(B):
   result = foo(B)
   return result

Здесь, в функции bar после того, как функция foo завершит свою работу, она вернется к предыдущей области действия, которая является областью действия функции bar и будет выполнена следующая строка return result.

Логика одинакова в рекурсивных функциях, разница в том, что вы вызываете одну и ту же функцию снова и снова. После того, как вы достигнете конечного условия, вы вернетесь к предыдущей области, пока снова не достигнете конечного условия. И это действие будет повторяться до такой степени, что вы достигнете всех возможных окончательных условий.

Итак, в вашем случае, когда вы впервые достигнете финального условия, у вас будет:

n=7, picked = [0,1,2], smallest = 2, n = 1

после того, как вы вернетесь из финального условия, вы выбрали массив будет [0,1,2,3], и код выполнит следующую строку. который будет picked.pop(). Таким образом, вы снова получите picked = [0,1,2], но на этот раз вы достигли последней строки цикла.

Так что в следующий раз ваше значение next будет обновлено с помощью smallest + 1 или 4, и снова это будет повторяться до тех пор, пока ваш цикл не достигнет своего конца. и вы снова получите [0,1,2].

После окончания цикла ваша функция вернется к предыдущей области видимости. На этот раз появится [0,1,2], и вы получите [0,1], и процесс повторяется. [Тысяча сто тридцать два]

0
ответ дан Farhood ET 27 March 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: