После неудачной установки вам необходимо отремонтировать перераспределители vc 2015 года и перезапустить установщик визуальной студии.
Распространяемый установщик перепутался, он смешивает 64-битную и 32-разрядную DLL-файлы. Вы можете проверить, есть ли у вас эта проблема, посмотрев размер файла vcruntime140.dll. Поиск в папке Windows для vcruntime140
вы должны увидеть 4 файла (64 и 32 бит в обеих версиях выпуска и отладки). Если какие-либо файлы имеют одинаковый размер, вам нужно запустить ремонт на распространяемом.
В моей системе 32-разрядная dll имеет 83,3KB, 64 бит - 86,6KB (версии выпуска).
Представьте себе:
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]
, и процесс повторяется. [Тысяча сто тридцать два]