Step 1 (S-38594)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/13027/step/1

Step 1 (S-38594) 1.png

[00:00 - 00:18] привет с этим изучая функции функции это очень классная вещь не позволяет выполнять одни и те же действия много раз нам не придется писать много раз 1 и тоже как это было на прошлом занятии например что такое функция в программировании они вообще говоря отличается от функции математике


Step 1 (S-38594) 2.png

[00:18 - 00:34] потому что математические функции могут только принять какие то параметры переменные или еще что то и дать ответ а в программировании функции мне гораздо больше они могут что нибудь делать давайте сразу смотреть например пусть нам нужно посчитать наибольший общий делитель


[00:34 - 00:53] 2 чисел что такое наибольший общий делитель это наибольшее положительное число которое делится и 1 из чисел и 2 из чисел от пример если у вас есть 2 пиццы 1 там разрезана 12 кусочков другая на 8 кусочков вы хотите узнать на какое максимальное количество людей можно там раздать и 1 пицца и 2


[00:53 - 01:12] ответ правильный 4 это и есть наибольший общий делитель с некоторых можно разделить эту пиццу и другу а 6 там на 8 уже нельзя вообще функцию мы умеем пользоваться мы уже делали функцию мы мы пользовались уже готовыми функциями так что ничего сложного


[01:12 - 01:27] вот так создается функция get the greatest common divisor наибольший общий делитель она принимает на вход в а параметрах раньше мы такого не делали но все довольно просто into int б


Step 1 (S-38594) 3.png

[01:27 - 01:45] что то означает означает что мы считаем функцию от 2 чисел можно узнать о председатель чисел арифметических выражений чего они будут подставляться на место а и б как штате наибольший общий делитель полагает которые изучают в школе я сразу напишу очень крутой версию


[01:45 - 02:02] а потом без него как она работает пока вы не равно 0 что мы делаем заводим временную переменную которых кладем остатка деления она б затем в б кладем


[02:02 - 02:20] кладем это самое ц когда у нас цикл закончится б станет равно 0 то в переменной а окажется как раз наш наибольший общий делитель то если вспомните младшую школу там был почетной больше общего делителя с вычитанием мы заменили вычитание на взятие остатка от деления


Step 1 (S-38594) 4.png

[02:20 - 02:37] как будет работать быстрее и теперь когда мы знаем где находится наш наибольший общий делитель мы возвращаем это значение вернуть значение это по сути подставить на место


[02:37 - 02:52] вызвал функцию в то место где оно вызывалось то значение которое функции вернул давать ребенку при переменной называть их можно по другому они не имеют никакого отношения к тем переменам которой находится функцию


Step 1 (S-38594) 5.png

[02:52 - 03:08] щитами и можем сразу напечатать результат выполнения функции поиска наибольший общий делитель запускаем проверяем


Step 1 (S-38594) 6.png

[03:08 - 03:24] неправильно отлично значит где то ошибка давайте еще раз получимся искать наш ошибки можно поставить и внутри функции выполняют уж программу по шагам кнопка f 11 step into вот здесь уже появляется разница между 100 полок и стопы то


Step 1 (S-38594) 7.png

[03:24 - 03:40] то есть мати функцию это я пойтить не входить функцию а пропустить ее сразу получить значение то кнопочка в 10 почти везде они такие же как вижу в студию он нам нужна и 11 считанного числа и наем


Step 1 (S-38594) 8.png

[03:40 - 03:57] 12 8 и заходим внутрь вот мы оказались здесь сделаем переменная i бы чтобы в этих текущее значение нравится пока что еще не существует потому что она есть только внутри цикла


Step 1 (S-38594) 9.png

Step 1 (S-38594) 10.png

[03:57 - 04:12] все оказалось четверка вы оказалось 12 в оказалось 4 продолжал чтоб не то он здесь нас похожи 500 ошибку давайте посмотрим еще раз


[04:12 - 04:29] вот у нас она превратилась 0 ab осталось равно четверки ну где есть 2 способа решить проблему либо дождаться того момента пока не станет равным 0 либо менять местами внутри цикла мы поменяем


[04:29 - 04:47] значит а мы будем класть старое значение б о в б будем класть значение ц посмотрим что действительно проблема исправилась да теперь она считает наибольший общий делитель правильно


Step 1 (S-38594) 11.png

Step 1 (S-38594) 12.png

Step 1 (S-38594) 13.png

[04:47 - 05:03] с помощью нашей функции поиска наибольшего общего делителя может решить еще 1 простую задачку сократить дробь как мы это будем делать мы хотим найти наибольший общий делитель числителя и знаменателя и каждый из них разделить на этот наибольший общий делитель получит ровно то что нам нужно


[05:03 - 05:18] этого нам понадобится функции сердца ничего не будет возвращать она будет менять значение переданных переменных непосредственно сейчас это уже как отделать вводит родился вот это означает что ничего не возвращайся


Step 1 (S-38594) 14.png

[05:18 - 05:37] сейчас я напишу немножко моде я объясню что такое смотрите здесь господа наибольший общий делитель я передавал переменной без всяких значков б у меня написано это означает что у нас будет условно локальная переменная которая видна только внутри функции ц д


Step 1 (S-38594) 15.png

[05:37 - 05:52] и в нее будет скопирован то значение что нам передали вот мы вызываем от н м да будет копироваться n и m соответственно если мы их меняем то это изменения происходят только внутри функции


[05:52 - 06:07] а наш переменной nm меняться не будут если мы передаем по указателю да то ставим образца то на самом деле не создает никаких копий а функции непосредственно может обращаться к тем данным которые ей передали


[06:07 - 06:24] то есть и продает с места в памяти где лежит перемена если мы что то меня то оно меняется везде и так как нам сделать сокращения дроби посчитаем наибольший общий делитель числителя и знаменателя


Step 1 (S-38594) 16.png

[06:24 - 06:40] затем а разделим по сокращенной записи и бороздили когда мы хотим вызвать функцию воть то мы никаких прислали не пишем


[06:40 - 06:59] а просто пишем имя функции и передаем ее параметры здесь изменится непосредственно значениях переменных n n так что напечатать нужно их же будет нас будет не


Step 1 (S-38594) 17.png

Step 1 (S-38594) 18.png

[06:59 - 07:14] 12/8 8 12 все хорошо за исключением того что я опять забыл поставить пробел


Step 1 (S-38594) 19.png

Step 1 (S-38594) 20.png

[07:14 - 07:29] 8/15 ну здорово 2 трети действительно неисправимая дробь в этой программе у нас есть целых 3 функции main редьюса для сокращения дроби и господа


Step 1 (S-38594) 21.png

[07:29 - 07:45] ничего страшного не происходит если 1 функция вызывает другую все довольно просто и понятно как только у нас появился вызов функции работа программы приходят нее и выполняется вся эта функция когда возвращаться к от значения то мы возвращаемся к тому месту где мы ее вызвали


Step 1 (S-38594) 22.png

[07:45 - 08:03] ничего страшного не произойдет если это будет вызывать саму себя это называется рекурсии и очень любят пугать на самом деле вещь очень проста у вас есть функция как последовательность команд какие действия она должна выполняться а память у каждого экземпляра функции своя


[08:03 - 08:18] пусть у вас есть 1000000000 людей у каждого есть листочек на котором можно писать несколько чисел вы хотите взять последовательность длиной в миллиарды и записать ее задом наперед по это дело ни у кого он целиком последовательность на листочек не влезть то можно писать максимум несколько чисел


[08:18 - 08:34] как мы будем выполнять эту задачу мы будем подходить к очередному человеку назвать его 1 число а затем идти к следующему когда мы знаем все числа последний человек толкнет бог предпоследнего и скажет все давай называть обратно


[08:34 - 08:52] и в обратном порядке они так постепенно будут толкать друг друга локтем в бок и называть числа получится развернуто последовательность напишем это виде программы нам понадобятся функция которая будет считывать 1 число


Step 1 (S-38594) 23.png

Step 1 (S-38594) 24.png

[08:52 - 09:12] запоминать его передавать управление следующем а когда я толкнут бог локтям писать число как сформулировать задачу целиком пусть у нас есть последовательность чисел оканчивается 0 необходимо


Step 1 (S-38594) 25.png

Step 1 (S-38594) 26.png

[09:12 - 09:27] привести ее задом наперед не используется векторов массивов ничего итак рекурсивная функция это вот 1 человек для него должна быть написана инструкция что он должен делать во 1 он должен


[09:27 - 09:45] завести себе коробочку для хранения чисел считать туда свое число очередное которому нас назвали если это число не 0 то что нужно сделать нужно отсылать следующему человеку


Step 1 (S-38594) 27.png

[09:45 - 10:04] твоя очередь работе то есть вызвать рекурсивную функцию а затем когда она отработает то есть тот человек уже сам поработал и всех кто после него тоже заставил работать и закончил свое дело пришло время сказать что мы запомнили


[10:04 - 10:22] было равно 0 то просто не нужно ничего делать теперь достаточно 1 раз вызвать функцию 1 человеком назвать число и все будет работать проверяем


Step 1 (S-38594) 28.png

[10:22 - 10:36] пусть нас есть последовательность 1 2 3 4 5 0 смотрим действительно она развернулась успешно без массивов посмотрим еще 1 задачку как посчитать факториал


[10:36 - 10:52] трал это произведение всех чисел от 1 до н мы считаем что можно решить несколькими способами можно решить рекурсивно а можно не рекурсивно что говоря про рекурсию есть много шуток но мы обойдемся без них потому что на самом деле все это очень просто


Step 1 (S-38594) 29.png

[10:52 - 11:08] и понятно если вы знакомы с математической индукции то вам будет вообще очень легко потому что ведь много знакомых и так функция для подсчета факториала понимает 1 параметр от чего считать факториал как работает 3 курсе


Step 1 (S-38594) 30.png

[11:08 - 11:25] мы делаем свою часть работы а все остальное поручает кому то другому и просто пользуешься плодами чужого труда она обязательно когда то должна остановиться ну мат индукции это называется там базовая и то условиях в случае факториала базы может выступать факториал от 0


Step 1 (S-38594) 31.png

Step 1 (S-38594) 32.png

[11:25 - 11:41] по определению он равен единице то есть если n равно 0 то наговорю что факториал равен единице делом которое 1 во всех остальных случаях как считать в триал если мы хотим мы предпочитаем 3 5


Step 1 (S-38594) 33.png

[11:41 - 11:56] то это 5 умножить на факториал 4 а как стать 2 4 то совершенно не интересует нам надо сделать свою часть работ что мы делаем возвращаем н умноженное на факториал как н - 1


Step 1 (S-38594) 34.png

Step 1 (S-38594) 35.png

[11:56 - 12:12] запустим с какими то конкретными значениями триал 5


[12:12 - 12:29] 120 читает правил целом схема для рекурсивной функции такая же как у нас сначала ставим условиях когда рекурсию должно закончится затем делаем все остальное это пункты можно применить в еще она полезна задач


Step 1 (S-38594) 36.png

[12:29 - 12:45] пусть у вас есть n человек из них нужно выбрать как добровольцу можно посчитать сколькими способами можно это сделать это называется цен пока давайте научимся это делать вот наша функция цен пока принимает на вход в а параметрах


[12:45 - 13:00] n и к сколько людей всего и сколько добровольцев нужно выбрать из математики мы знаем волшебную формулу цены пока равно n факториал делить на к факториал и делить на икс - ровно этой напишут


Step 1 (S-38594) 37.png

Step 1 (S-38594) 38.png

[13:00 - 13:18] а темп поделить на произведение 2 3 от к и н - а вы нашу функцию для подсчета цен пока


[13:18 - 13:33] с какими то конкретными значениями да давайте ничего не будем читать про например у нас есть всего 6 человек мы не хотим выбрать 3 добровольцев


Step 1 (S-38594) 39.png

Step 1 (S-38594) 40.png

[13:33 - 13:48] есть 20 способов это сделать посмотрим еще 1 простое оно полезное в жизни применения функции напишем простенькую функцию проверки шла на четность


Step 1 (S-38594) 41.png

Step 1 (S-38594) 42.png

[13:48 - 14:05] является ли число что параметр у меня всего 1 если у нас нет параметра функции так тоже бывает только тогда мы оставляем пустым вспомните как мы собственно bull и занимает пол означает что оно возвращает значение истина или ложь


[14:05 - 14:22] буду возвращать результат подсчета логического выражения остатка от деления n на 2 равен 0 вы то довольно простая бесполезно но иногда бывает сложно логически выражение которое удобно оформить эти функции тогда он пишет меньше букв все понятно


Step 1 (S-38594) 43.png

[14:22 - 14:38] итак мы забудем переменную какую нибудь учитывая число и печатаем является ли оно четко


[14:38 - 14:56] он возвращает нам единичку это в случае истина и нолик если у нас ложь особенно по удобно это применять и в их


Step 1 (S-38594) 44.png

Step 1 (S-38594) 45.png

Step 1 (S-38594) 46.png

[14:56 - 15:11] то есть если и заявил тогда печатаем ес ну или чет она лучше


[15:11 - 15:30] нечетное если у вас есть какой то логическое выражение то лучше в оформить в виде функции с говорящим названием тогда


Step 1 (S-38594) 47.png

[15:30 - 15:45] будет намного проще писать и читать но в целом о функциях немного иногда бывает полезно выносить куски кода функции даже если они вызывают 1 раз почему так человек может держать в голове не очень большое количество


Step 1 (S-38594) 48.png

[15:45 - 16:04] разных вещей но и применительно к программированию размер функция должен быть такой чтобы она целиком влезал на экран тогда я должен читать и можно понимать что там было в начале что там сведения что в конце и все видите перед глазами это хороший стиль программирования если у вас получилось длинное длинное полотно


[16:04 - 16:19] нарезать на кусочки так чтобы каждый из них был логично и занимал не очень много места особенно конечно полезно писать функция для тех участков кода который повторяется много раз например нашим сайтом пока 3 раза вызывала триал


[16:19 - 16:38] мы просто писать название функции все работало хорошо 1 часть валишь незадача довольно простая не нужно просто написать функцию которые будут делать то что нужно а вот он 2 часть вам придется поломать голову потому что там будет 3 курсе а к ней нужно привыкнуть но я верю что вы справитесь к тому же впереди у нас довольно простое занятие посвященное сроком


[16:38 - 16:40] а встречи