Представьте себе:
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]
, и процесс повторяется. [Тысяча сто тридцать два]
Можно использовать JSBin для тестирования отрывков кода с отрывками HTML и некоторых js платформ.
Я использую Firebug для в значительной степени всего JavaScript.
Я использую Firebug безусловно большинство раз.
Иначе я использую addressbar или просто добавление кнопки или ссылки на странице.
Если Вы хотите отладить и запустить JavaScript на лету на IE, Вы можете alos давать Debugbar попытку. Это работает отлично.
Я использую tryit.asp на тексте ссылки на w3school, поскольку я обычно проверяю свой HTML с тем сайтом так или иначе. Это также позволяет мне пробовать изменения, прежде чем я перейду в далеко.
Для тестирования маленьких сценариев через различные браузеры у меня есть файл HTML, лежащий, вокруг которого просто содержит
<pre><script>
</script></pre>
Вход сделан через document.writeln()
.