Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
«Дурак подкидной и переводной» — классика карточных игр! Яркий геймплей, простые правила. Развивайте стратегию, бросайте вызов соперникам и станьте королем карт! Играйте прямо сейчас!

Дурак подкидной и переводной

Карточные, Настольные, Логическая

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Javascript + Web

С этим тегом используют

Программирование IT HTML IT юмор Программист Frontend CSS Web-программирование Сайт Веб-разработка Дизайн Все
141 пост сначала свежее
Аноним
Аноним
1 год назад

Ищу программиста, чтобы создать браузерную игру⁠⁠

Всем привет. Возможно я выложу таких несколько постов. Мы ищем программиста готового повторить старую .mobi игру. Как раньше существовали порталы Wap на которых и игры размещались и тд по типу Tegos. Нужно создать онлайн игру вот как она должна выглядеть:

Сделать нужно красиво, чтобы смотрелось не вырвиглазно. Был интузиаст который пытался разрабатывать игру один, но вот результат

Ищу программиста, чтобы создать браузерную игру Игры, Wap, Java, Javascript, HTML, Программирование, Программист, Web, Web-программирование, Видео, YouTube, Длиннопост
Ищу программиста, чтобы создать браузерную игру Игры, Wap, Java, Javascript, HTML, Программирование, Программист, Web, Web-программирование, Видео, YouTube, Длиннопост

ЕСЛИ ВЫ ГОТОВЫ ВЗЯТЬСЯ ЗА РАБОТУ. НАПИШИТЕ СВОЙ ТЕЛЕГРАММ ПОД ЭТИМ ПОСТОМ. РЕШИМ ВОПРОС С ЦЕНОЙ.ЖДУ НАДЕЮСЬ НАЙДЁТСЯ ЧЕЛОВЕК.

Показать полностью 2
[моё] Игры Wap Java Javascript HTML Программирование Программист Web Web-программирование Видео YouTube Длиннопост
6
4287
propovednikHulio
1 год назад

Фронтендщики, отзовитесь!⁠⁠

Фронтендщики, отзовитесь!
Javascript Frontend Web IT юмор Программирование Комиксы Theycantalk Гусь
409
29
tproger.official
tproger.official
2 года назад
Типичный программист

JS тот ещё советчик⁠⁠

JS тот ещё советчик IT юмор, Программирование, IT, Картинка с текстом, Программист, Python, Javascript, Web
Показать полностью 1
IT юмор Программирование IT Картинка с текстом Программист Python Javascript Web
8
pdsnupeper0nyx
2 года назад

Как добавить свою верстку?⁠⁠

Доброго времени суток. У меня есть сайт, он хостится на bitrix24. Также у меня на Nic.ru куплены dns-сервера. Мне нужно каким-то образом загрузить на мой сайт файл html с js логикой и css.

HTML Bitrix24 Битрикс RU-CENTER Web Nginx Сайт CSS Javascript Текст
16
4
Ethosa
Ethosa
2 года назад
Web-технологии

Happyx - Web framework written in Nim⁠⁠

В этой статье хочу представить вам новый веб фреймворк Happyx, написанный на языке программирования Nim, а также получить отклик. Возможно вы можете предложить несколько отличных идей, которые смогут продвинуть данный фреймворк вперед?

Во-первых, почему я выбрал Nim?
Выбор этого языка обоснован его скоростью, эффективностью, а также возможностями, который предоставляет этот язык: макросы, кросс-компиляция (поддерживается компиляция в JS, C, Cpp а также ObjC)

Во-вторых, что же такое Happyx и с чем его едят?
На данном этапе разработки Happyx является гибридом SPA и SSG.
В плане SSG Happyx запускает сервер и передает через него необходимые HTML файлы и прочие ресурсы.
В плане SPA Happyx позволяет использовать компоненты с элементами реактивности.
При этом роутинг обеих частей происходит схожим образом - поддерживаются различные параметры пути: "/path/to/user{id:int}/hash{re:/\S[a-z]{5}\d+/}"


Исходный код, примеры и тесты: https://github.com/HapticX/happyx

[моё] IT Разработка Javascript Nim Программирование Web Текст
10
Web.Study
Web.Study
2 года назад

Promise API в Javascript⁠⁠

Объект Promise (промис) используется для отложенных и асинхронных вычислений.


Синтаксис


new Promise(executor);

new Promise(function(resolve, reject) { ... });


Параметры


executor

Объект функции с двумя аргументами resolve и reject. Функция executor получает оба аргумента и выполняется сразу, еще до того как конструктор вернет созданный объект. Первый аргумент (resolve) вызывает успешное исполнение промиса, второй (reject) отклоняет его. Обычно функция executor описывает выполнение какой-то асинхронной работы, по завершении которой необходимо вызвать функцию resolve или reject. Обратите внимание, что возвращаемое значение функции executor игнорируется.



Наш канал

[моё] Программирование IT Javascript Web-программирование Web Веб-разработка Текст
3
20
Web.Study
Web.Study
2 года назад
Web-технологии

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами⁠⁠

Так как тема прошлого поста про рекурсию был сложноватой для новичков, я решил залупить цикл публикаций о самой алгоритмизации. При этом попытаюсь разжевать все понятнейшим языком, чтобы джун смог с нуля всё понять.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

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



Зачем мне алгоритмы? Я фронтендер!


Вы наверняка задумались: «А зачем мне нужно тратить своё время на изучение этих сложных алгоритмов, если я работаю с фронтендом? Как знание графов и бинарных деревьев поможет мне лучше отцентровать одну div-ку внутри другой div-ки?»


Многие веб-разработчики на таких форумах, как Reddit и Stack Overflow, отмечали, что, освоив даже на базовом уровне эти фундаментальные основы программирования, чувствовали себя увереннее, профессиональнее и писали более чистый и структурированный код.


Также это помогло им прокачать главный скилл разработчика – умение логически думать и решать сложные технические задачи.


Кстати, именно по этой причине многие крупные IT-компании требуют от своих потенциальных сотрудников знания фундаментальных основ computer science, к которым как раз относятся алгоримты и структуры данных, и с пристрастием спрашивают их на собеседованиях (даже на позицию фронтенд-разработчика!).



Что такое алгоритмы и структуры данных


Алгоритм — это совокупность последовательных операций, направленных на решение определенной задачи.


Структуры данных — это особый способ организации и хранения данных в компьютере, который обеспечивает эффективный доступ к этим данным и их изменение. Для оценки сложности и скорости работы алгоритма используют так называемую «О-нотацию» или «О-большое».


Эта запись имеет вид O(n), где n – это количество операций, которое предстоит выполнить алгоритму. Важное замечание: O(n) всегда описывает худший возможный случай выполнения алгоритма. Это дает нам гарантию, что наш алгоритм никогда не будет работать медленнее O(n).


Скорость работы алгоритмов измеряется не в секундах, а в темпе роста количества операций. Т.е. нас интересует, насколько быстро возрастает время выполнения алгоритма с увеличением размера входных данных.


Вот так выглядит время работы некоторых алгоритмов:


O(1) – константное время. Например, чтение данных из ячейки в массиве.


O(log n) – логарифмическое время. Например, бинарный поиск.


O(n) – линейное время. Например, поиск наименьшего или наибольшего элемента в неотсортированном массиве.


O(n * log n) – линейно-логарифмическое время. Например, быстрая сортировка.


O(n2) – квадратичное время. Например, сортировка пузырьком.


O(n!) – факториальное время. Например, решение задачи коммивояжера полным перебором.



Алгоритм линейного поиска


Давайте для начала рассмотрим такой простейший алгоритм, как линейный поиск элемента в массиве, и реализуем его на JavaScript.

Итак, есть массив чисел, и нам нужно найти в нем конкретное число.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Создадим функцию линейного поиска и назовем ее linearSearch. Эта функция будет принимать в себя два параметра: array (т.е. сам массив элементов, в котором ведется поиск) и item (элемент, который мы ищем в этом массиве).

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

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

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Далее инициализируем счётчик и установим его исходное значение, которое будет равно нулю, так как мы собираемся проверять массив с самого первого элемента.

let i = 0;
Наш цикл будет выполняться до тех пор, пока не пройдет по всем элементам массива. В качестве конечной точки мы используем значение array.length, которое возвращает количество элементов в массиве. Так как массив array начинается с нулевого индекса, то мы используем при сравнении знак «<».

i < array.length;

После каждой итерации цикла увеличиваем значение переменной i на единицу.

i++

Далее с помощью условной конструкции if будем проверять на истинность одно условие. Данная проверка будет выполняться при каждой итерации цикла, но код внутри нее сработает только один раз, после чего функция завершится.


Здесь мы сравниваем каждый элемент массива (array[i]) c искомым элементом (item) и, если эти элементы совпадают, то возвращаем i (индекс массива, по которому находится этот искомый элемент item).

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Если же искомый элемент не был найден, то по завершении работы цикла мы возвращаем -1.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Дальше нам остается только вызвать функцию linearSearch, первым параметром передать в нее массив элементов, а вторым параметром — искомое число.


Затем, с помощью функции console.log, выводим результат в консоль.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Как видите, алгоритм линейного поиска довольно прост в реализации. Сложность данного алгоритма: линейное время или O(n).


Давайте теперь рассмотрим более сложный и интересный алгоритм, который еще называют алгоритмом бинарного поиска.



Алгоритм бинарного поиска


Бинарный (или двоичный) поиск — это алгоритм, при котором массив данных будет последовательно делиться пополам до тех пор, пока не будет обнаружен искомый элемент.


Важное замечание: данный алгоритм будет работать только для отсортированного массива.


Бинарный поиск может быть реализован следующим образом:


0. Берём исходный массив отсортированных данных (например, по возрастанию).

1. Делим его на две части и находим середину.

2. Сравниваем элемент в середине с искомым элементом.

3. Если искомое число меньше этого центрального элемента — продолжаем искать элемент в левой части массива. Для этого мы делим левую часть массива на 2 части. Если искомый элемент больше центрального элемента, то мы отбрасываем левую часть массива и продолжаем поиск в правой.


И повторяем данную процедуру до тех пор, пока не найдем искомый элемент. Как только мы его нашли, то возвращаем индекс в массиве, по которому он находится. Если же данный элемент не будет найден, то возвращаем -1.


Давайте сначала взглянем на реализацию данного алгоритма, а потом разберем ее детально.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Итак, у нас есть массив чисел arr, отсортированный по возрастанию. Как вы помните, если заранее не отсортировать массив, то бинарный поиск не будет работать.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Создаем функцию binarySearch и передаем в нее два параметра: отсортированный массив arr и искомый элемент value.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Затем определяем следующие переменные:

let start = 0;

Так как мы должны найти центральный элемент, то сначала необходимо определить начальный и конечный элементы.


Задаем таким образом начальный элемент и устанавливаем его значение равным нулю, так как наш массив начинается с нулевого индекса.

let end = arr.length - 1;

Затем определяем конечный элемент. Его позиция будет вычисляться по длине массива arr.length - 1.


Далее мы создадим цикл while, который будет работать до тех пор, пока начальная и конечная позиция массива не сравняются (start <= end).

let middle;

Внутри цикла мы будем высчитывать позицию центрального элемента в массиве и сохранять ее в переменную middle. Для этого мы складываем начальную позицию с конечной и делим результат на две части.


Результат обернем в функцию Math.floor(), так как в результате деления у нас может получиться дробное число. С помощью данной функции мы округляем полученное число до нижней границы.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Далее с помощью условной конструкции if создаем проверку: если центральный элемент в массиве по индексу middle равен искомому элементу, то мы возвращаем индекс найденного элемента, сохраненный в переменной middle. И на этом наша функция завершает свою работу.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

Если на данной итерации цикла мы не нашли искомый элемент, то необходимо выполнить еще одну проверку с помощью условной конструкции if. Если искомый элемент меньше, чем элемент, находящийся в середине, то это значит, что нам нужно продолжить поиск в левой части массива, а правую можно отбросить.


Для этого нам нужно изменить значение переменной end. В итоге мы получим end = middle + 1. А в блоке else мы прописываем такое же условие, только для случая, если искомый элемент будет больше, чем элемент, находящийся в середине. Тогда мы отбрасываем левую часть массива и продолжаем поиск в правой.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

После завершения цикла while возвращаем -1 на случай, если искомое число не будет найдено в массиве. Далее вызываем функцию binarySearch и передаем в нее два параметра: массив элементов и искомое число.


И выводим результат в консоль.

Это сложно, да и зачем мне алгоритмы? Я же фронтендер! Объясняем алгоритмизацию простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Мат, Длиннопост

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


Последовательная сложность бинарного поиска в худшем и среднем случаях равна O(log n), в лучшем — O(1) (если обнаруживаем искомый элемент на первой итерации). Для сравнения: вычислительная сложность линейного поиска, как вы помните, равна O(n).



На этом мы закончили вторую статью из нашего цикла статей по алгоритмам. Спасибо за внимание.

Показать полностью 13
[моё] Программирование IT Полезное Алгоритм Рекурсия Javascript Web-программирование Web Веб-разработка Мат Длиннопост
6
Партнёрский материал Реклама
specials
specials

Как бросить курить и не сорваться: инструкция от тех, кто смог⁠⁠

Выходишь покурить на пять минут, а возвращаешься через 10 лет: с хрипом, тремя неудачными попытками бросить и пачкой мятных жвачек в кармане. Это как плохой сериал: тянется слишком долго, а финал все равно разочарует. Но выйти из этого сценария можно и даже не обязательно драматично. Мы собрали истории тех, кто боролся с зависимостью ради любимого человека, здоровья или лучшей жизни.

Как бросить курить и не сорваться: инструкция от тех, кто смог Курение, Борьба с курением, Зависимость, Telegram (ссылка), ВКонтакте (ссылка), Длиннопост

История 1 — отражение

@ holoroad

Маленькая дочка почти научилась ходить и всюду телепалась за мной. Я не курил при ней. Ходил на балкон, а она, прильнув к стеклу, смотрела на меня и ждала, когда я докурю и выйду к ней. И в какой-то момент она начала повторять за мной вот эти движения. Маленький человечек, ей было года полтора или два, прикладывала воображаемую сигарету к губам, а потом делала вид, что выпускает дым. И весело так на меня смотрела, сквозь стекло балконной двери. Ей нравилось все, что со мной связано, и она подражала всем моим действиям. Я курил уже двадцать лет и, конечно, делал множество попыток бросить до этого. Но в этот раз у меня в первый раз появилась по-настоящему важная причина бросить. Это важно для человека, который безгранично мне доверяет. С тех пор прошло почти десять лет, в течение которых я не сделал ни одной затяжки.

Решение бросить курить — одно из лучших, которое вы можете принять для своего здоровья, будущего и близких. Но справиться с зависимостью только потому, что «это вредно» будет тяжело. А вот если хотите не задыхаться, поднимаясь по лестнице, или волнуетесь за своего ребенка, которые вдыхает табачный дым, — уже другое дело.

Сформулируйте, что для вас значит отказ от никотина. Это может быть желание прожить дольше, избавиться от проблем со здоровьем, выглядеть моложе, сэкономить деньги или защитить близких от пассивного курения. Напоминание об этой причине повесьте на видное место.

История 2 — список

@ maxneb

Беременность жены, рождение ребенка, здоровье, деньги — ничего не было веским поводом бросить окончательно. Постоянно срывался. Помогло составить список, что теряю и что получаю от сигарет, и понимание, что хотя бы одна затяжка — и все насмарку: пару месяцев буду курить. Только список и его осознание. Для каждого он свой. И постоянное обращение к нему. После составления списка курил еще. Но он как заноза висел в голове с вопросом «зачем?»... Так, что-то щелкнуло и сейчас не тянет. Иногда тянет физически, но осознание бесполезности курения сразу глушит позывы. Полгода, полет нормальный...

Бросать на авось — идея, которая подойдет не всем. Нужно понимать, что делать в трудные моменты:

  • Определите дату отказа. Подготовьтесь морально, уберите сигареты, зажигалки, пепельницы.

  • Замените привычки. Сигарету в руках можно заменить орешками, палочками морковки, жвачкой или даже кубиком льда.

  • Займите время. Вспомните, чем вы любили заниматься: спорт, хобби, прогулки.

  • Планируйте, что делать при тяге. Она длится всего 3–5 минут. Дыхательные практики или звонок другу помогут пережить сильное желание закурить.

  • Откажитесь от «наградных сигарет». Одна затяжка и вы откатитесь назад.

Можно бросить резко, «с понедельника», или постепенно, снижая количество сигарет до нуля. Главное — определиться и не отступать.

История 3 — переключение

@ Spaka

45 лет, стаж 30. Пытался завязать много раз, потом понял, что после каждой попытки бросить, курить начинаешь больше. Как ребенок, которому не дают вкусняшку, а она случайно попала ему в руки. Из чего мозг сделал вывод: не уверен — не бросай. Потом стал замечать, что организм уже стал сам просить перестать курить. По утрам было очень неприятно во рту, удовольствие после сигареты стало короче, а негатив, приходящий следом, ощутимее: неприятные ощущения в горле, боли миндалин, страх схватить онкодиагноз. Хотя врачи говорили, что все ок, в голове-то гоняешь мысли. Я решил попробовать обмануть сам себя. Не делать из процесса отказа какого-то события. Бросить так, как будто это и должно было произойти, но ты не знаешь когда. Про себя помолился, как сумел, и попросил помощи, хитро прищурил глаз и в момент, когда забыл купить про запас (оставалась пара штук в пачке), просто перестал курить. Мне теперь даже странно, как я раньше это делал. Так и живу почти два года. Кстати, раньше в момент завязки курящих ненавидел, дым был очень противен, до тошноты. Теперь все равно. Присоединяйтесь ;)

Есть несколько стратегий отказа от курения:

  • Резкий. Эффективный и решительный подход.

  • Постепенный. Сначала — меньше сигарет, потом — меньше затяжек. И так до нуля.

  • Психологическая замена. Каждая сигарета — это ритуал. Найдите для каждого из них «здоровую замену».

  • Медикаментозная терапия. При сильной зависимости врач может порекомендовать никотинозаместительную терапию (пластыри, таблетки, жвачки) или препараты, которые помогают справиться с синдромом отмены. Но любые лекарства принимаются только по рекомендации специалиста.

Каждый, кто хочет оставить зависимость в прошлом, может обратиться в центры здоровья, которые работают при поддержке нацпроекта «Продолжительная и активная жизнь», и получить необходимую помощь специалистов. Адреса доступны на официальном портале Минздрава России о здоровье: takzdorovo.ru. Также можно позвонить на горячую линию по отказу от зависимостей 8 800 200-0-200.

История 4 — форма

Аноним

Курила электронки 2 года как замену обычным сигаретам. Думала, что это не так дорого, не так вредно да и для девушки вроде более привлекательно: не пахнут волосы и руки. А потом решила привести свое тело в форму. Стала ходить в зал и поняла, что задыхаюсь на первом же упражнении, хотя женщины гораздо старше меня бодрячком. Было очень тяжело слезть. Друзья советовали заменять сигаретами. А потом уехала в отпуск в страну, где нельзя покупать электронки, отвлеклась, и после возвращения уже не тянуло. Даже на тусовках, где все дымят.

За модными гаджетами и фруктовыми ароматами скрывается химическая бомба, разрушающая организм быстрее, чем обычные сигареты. Электронные сигареты активно продвигаются производителями как «безопасная» альтернатива сигаретам. Но курение вейпа может обернуться серьезными проблемами: от кашля и одышки до поражения сосудов и дыхательных путей.

«Особую тревогу вызывает рост потребления табачных изделий и электронных сигарет. Согласно исследованию, проведенному в нашем Центре, 36,8% курильщиков потребляют одновременно и табак, и электронные сигареты. Среди молодежи в возрасте 25-39 лет этот показатель превышает 45%. Электронные никотиносодержащие и безникотиновые устройства поражают сердце, сосуды, дыхательную систему и ДНК организма не менее пагубно, чем традиционные сигареты, а в ряде случаев способны вызывать острые состояния, включая сосудистые поражения и летальные исходы» – рассказывает руководитель Центра профилактики и контроля потребления табака НМИЦ терапии и профилактической медицины Минздрава России Маринэ Гамбарян.

История 5 — пари

@ kernima

Вроде не было никаких серьезных предпосылок, чтобы бросить. Да и чтобы начать: просто все вокруг курили, думал, это сейчас тренд. А потом как-то сидели в баре и решили поспорить с некурящим другом. Он затирал, что моя жизнь из-за электронки катится ко дну, я — доказывал, что это всего лишь маленькая шалость. В общем поспорили на пять тысяч. Чтобы было легче и можно было отвлечься, начал бегать по утрам. Друг проиграл, а я возвращаться к курению не стал. Вдруг снова у еды появился вкус, я начал высыпаться и больше не устаю на втором лестничном проеме. Короче, советую!))

Сульфат никотина, один из компонентов электронных сигарет, раньше использовали как пестицид, но запретили из-за высокой токсичности. Жидкость для «электронок» содержит и опасные химикаты вроде пропиленгликоля, ацетальдегида и акролеина — промышленных веществ, способных вызывать воспаления, поражения органов и мутации клеток. Ароматизаторы, создающие иллюзию безвредности, на деле могут привести к более тяжелой интоксикации, чем при курении сигарет. А еще вейпы содержат не природный, а синтетический никотин — солевой. Он быстрее всасывается, дольше выводится и вызывает зависимость стремительнее.

Когда организм отвыкает от никотина, бывает нелегко: люди становятся раздражительным и нервозными, быстро устают, возникают сухость во рту, кашель, трудности с концентрацией. Важную роль в борьбе с этими симптомами играет питание. В рацион стоит включить овощи, фрукты, орехи, семечки. Клетчатка способствует очищению организма от токсинов. Важно питаться сбалансировано: с достаточным количеством белков, жиров, углеводов и витаминов. Лучше временно исключить продукты, усиливающие удовольствие от табака (например, мясо), а также отказаться от алкоголя, кофе и крепкого чая. Они могут спровоцировать желание закурить. А вот большое количество воды, травяных чаев и настоев облегчит очищение организма и поможет справиться с сухостью во рту.

История 6 — связь

Аноним

Устал курить, понял, что мне это мешает заниматься спортом и в целом комфортно себя чувствовать. Пошел через ассоциации: покурил во время головной боли, и потом через самовнушение дал себе установку, что голова болела от курения. Звучит странно, конечно, но это сработало. Никотиновую зависимость снижал постепенно через редкое курение кальяна (2-3 раза в неделю с последующим уменьшением).

Чтобы добиться успеха в отказе от курения, стоит подготовиться. Обязательно расскажите о своем решении друзьям и близким — поддержка со стороны очень важна. Если вы уже предпринимали попытки бросить, вспомните, что тогда пошло не так, и постарайтесь не повторять этих ошибок.

Разберитесь, что именно тянет вас к сигарете: скука, стресс, привычка? Когда вы это осознаете, будет легче подобрать альтернативные действия — прогулку, книгу, разговор с близким. Учитесь распознавать моменты, когда особенно хочется закурить, и переключаться на что-то другое. Можно подключиться к программам или группам поддержки — это поможет не сдаваться. И главное: уберите из дома все сигареты.

История 7 — вершина

Аноним

Поднимался с сыном по Пушкинской тропе на гору Железная. Мне лет сорок пять было, идем общаемся, сын бегает туда-сюда. Ну идем короче, а сзади нас догоняет семейная пара, мирно о чем-то щебеча между собой. Догнали и обходят. И так спокойно удаляются… Все бы ничего, но им лет по шестьдесят, если не больше. Я попробовал в их темпе, но задыхаться стал. Короче, поднялся я на гору, спустился, смял пачку и выкинул в мусорную урну. Вот уже 13 лет не курю. Стаж 27 лет.

Курение — это быстро развивающаяся зависимость, схожая по механизму с наркотической. Никотин воздействует на мозг, вызывая кратковременное улучшение настроения, за которым следует упадок сил и потребность в новой дозе. Со временем формируется толерантность, и прежние негативные реакции организма на табак ослабевают. Физическая зависимость сочетается с психологической: сигарета начинает ассоциироваться с отдыхом, решением задач, рутиной. Курение укрепляется поведенческими шаблонами: кофе, вождение, паузы на работе уже не мыслимы без сигареты.


Каждый, кто пытался избавиться от никотиновой зависимости, знает, как это тяжело. Ломка, раздражительность, навязчивые мысли. Даже при переходе на вейпы, иллюзия «меньшего вреда» быстро развеивается: химические коктейли из ароматических смесей также бьют по легким, сосудам и всему организму.

Хорошая новость в том, что вы не одни. В сообществе «Давай бросать» (ВКонтакте и мессенджере Telegram), который работает при поддержке нацпроекта «Продолжительная и активная жизнь» знают, каково бороться с триггерами, искать замену привычке и удерживать себя от срыва. Здесь делятся историями тех, кто смог, поддерживают тех, кто только начал, и помогают разобраться в главном: как пережить отказ без мучений.

Социальная реклама. АНО «Национальные приоритеты», ИНН: 9704007633

Показать полностью
Курение Борьба с курением Зависимость Telegram (ссылка) ВКонтакте (ссылка) Длиннопост
19
Web.Study
Web.Study
2 года назад
Web-технологии

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами⁠⁠

Для многих разработчиков рекурсия кажется чем-то очень сложным и непонятным, но это только на первый взгляд. В этой статье мы разложим все по полочкам, чтобы вы в следующий раз не боялись этого страшного слова "рекурсия".


Мы узнаем, как устроена рекурсия, а также разберем алгоритм сортировки массива под названием Quick Sort или, как еще его называют, быстрая сортировка Хоара. Как вы уже догадались, этот алгоритм рекурсивный.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Читайте нас в телеграме, там мы каждый день выкладываем полезные материалы из вселенной Front-end



Перейдем к статье


Рекурсия


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


Давайте взглянем на простой пример.


У нас есть простая функция обратного отсчёта:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Данная функция принимает аргументом число n и выводит на экран числовую последовательность от n до 1 включительно, а в конце, после завершения работы цикла, выводит на экран слово «Финиш».


Давайте вызовем эту функцию, передав в нее число 3. В консоли мы получим следующий результат: «3 2 1 Финиш».

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Теперь перепишем эту функцию на рекурсивный манер:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Разберемся, как эта функция работает. Первым делом, чтобы не получить бесконечный цикл вызовов функции и как результат ошибку «stack overflow», которая говорит нам о превышении лимита вызовов для функции в стеке, нужно определить так называемый базовый случай.


Базовый случай — это условие, при котором наша функция должна перестать вызывать саму себя рекурсивно.


Так как наш цикл работал до тех пор, пока i > 0, то здесь условие для прерывания цикла должно быть следующим:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

То есть, как только n будет меньше или равно нулю, мы перестаем рекурсивно вызывать функцию и выходим из нее. Перед выполнением оператора return необходимо будет вызвать наш console.log('Финиш'), потому что именно это действие и будет последним в работе функции.


По сути, базовый случай работает как оператор break в циклах, то есть прерывает вызов функцией самой себя, чтобы мы могли вернуть результат ее выполнения.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Дальше мы выводим в консоль текущее значение числа n. И, следующим шагом, снова вызываем нашу функцию countDownRecursive() и передаем в нее n - 1.


Как вы помните, в примере с циклом for, на каждой итерации цикла мы уменьшали число i на единицу (i--), поэтому здесь, по аналогии, передаем n - 1.


Запустим функцию и получим в консоли следующий результат:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Результат, как вы видите, аналогичен результату работы простой функции countDown.


Давайте теперь чуть подробнее разберём, как работает рекурсивная функция.



Как работает рекурсивная функция

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Итак, сначала мы вызываем функцию countDownRecursive со значением 3.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Базовый случай не отрабатывает, потому что n > 0. Мы выводим число 3 в консоль и дальше снова вызываем функцию, передав в нее n - 1, то есть 3 - 1 или просто число 2.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Повторяем эту процедуру, пока не дойдем до нуля:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

И вот здесь уже срабатывает базовый случай. Так как 0 === 0, выводим в консоль слово «Финиш» и дальше срабатывает оператор return.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Дальше происходит завершение работы всех предыдущих функций (потому что неявно завершенная функция возвращает undefined, то есть как только выполнение нашей функции доходит до закрывающей фигурной скобки, происходит return undefined).


Здесь вы можете подумать, что это всё очень сложно, и почему бы не использовать такой понятный и простой цикл for?


Важно отметить, что, действительно, не везде нужно применять рекурсию. Но бывают задачи, где рекурсивное решение выглядет очень элегантно и занимает гораздо меньше строчек кода, чем с использованием традиционных циклов.


Давайте разберем один из таких примеров.



Числа Фибоначчи


Как вы знаете, ряд Фибоначчи — это числовая последовательность, первые два числа которой являются единицами, а каждое последующее за ними число является суммой двух предыдущих.


Автором данной числовой последовательности был Леонардо Пизанский (более известный под прозвищем Фибоначчи) из итальянского города Пизы — один из крупнейших математиков средневековой Европы.


Вот так ряд Фибоначчи выглядит на практике:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Иногда перед первой единицей добавляют еще и ноль, но мы не будем рассматривать данный случай, а рассмотрим классический ряд Фибоначчи, как в средневековых книгах (но только без кроликов).


Наша задача — написать функцию, которой можно передать номер элемента ряда Фибоначчи, и на выходе из функции получить значение этого элемента.


Допустим, мы ищем 10-ый элемент в последовательности. Значением этого элемента будет 55. Для 12-го элемента значением будет 144 и так далее.


Вот так будет выглядеть эта функция, написанная с применением рекурсии:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

В результате работы функции в консоли мы получим число 8. Можете это проверить: если вы посмотрите на ряд Фибоначчи выше, то увидите, что значением 6-го элемента в ряду будет число 8.


Давайте разберём, как работает данная функция.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Объявляем стрелочную функцию fibonachi, которая принимает аргументом число искомого элемента в ряду — n.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Далее определяем базовый случай, т.е. условие, при котором выходим из рекурсии.


Так как мы будем последовательно уменьшать число n (об этом ниже), то нет смысла делать это бесконечно.


Как только n оказывается меньше 2, то это значит, что мы достигли начала ряда Фибоначчи, а значит дальше нам двигаться не нужно и можно возвращать n обратно вызывающему коду.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Если же базовый случай не отработал, то снова вызываем функцию, передав в ее аргументы n - 1 и n - 2 соответственно, и складываем результат этих функций между собой по следующей формуле: F(n) = F(n - 1) + F(n - 2). Эта формула позволяет нам найти число из ряда Фибоначчи. Так как каждое число равно сумме двух предыдущих чисел в цепочке, то именно эту формулу мы реализовали в нашей функции.


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



Быстрая сортировка Хоара


А теперь рассмотрим более сложный алгоритм. Он называется быстрая сортировка (Quick Sort) или сортировка Хоара.


Данный алгоритм был разработан английским информатиком Тони Хоаром во время работы в МГУ в 1960 году.


И вот здесь как раз будет применяться рекурсия.


Как вы помните, в предыдущей статье мы с вами разбирали широко известный в узких кругах алгоритм — пузырьковую сортировку. Ее единственный недостаток — это крайне низкая эффективность. Быстрая же сортировка является улучшенной версией подобных алгоритмов сортировки с помощью прямого обмена.


Итак, в чем суть. Имеется неотсортированный массив чисел arr.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Наша задача написать функцию, которая будет принимать в себя аргументом этот массив и возвращать его полностью отсортированным по возрастанию.


Быстрая сортировка относится к алгоритмам из серии «разделяй и властвуй».


Небольшое отступление. Алгоритмы типа «разделяй и властвуй» (англ. divide and conquer) — это парадигма разработки алгоритмов, заключающаяся в рекурсивном разбиении решаемой задачи на две или более подзадачи того же типа, но меньшего размера, и комбинировании их решений для получения ответа к исходной задаче. Разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными.


Наш алгоритм будет сводиться к следующим шагам:


1. Выбираем элемент из массива и считаем его опорным (в англоязычной литературе его называют pivot).


2. Сортируем элементы в массиве таким образом, чтобы элементы меньше опорного размещались в подмассиве перед ним, а большие или равные — в подмассиве после.


3. Рекурсивно применяем первые два шага к двум подмассивам слева и справа от опорного элемента. Т.е. дробим наш массив на подмассивы и сортируем их относительно опорного элемента, пока в этих подмассивах не останется по одному элементу или меньше. Рекурсия не применяется к массиву, в котором только один элемент или отсутствуют элементы. Это как раз и будет базовым условием, при котором мы прервем рекурсию.


Вот здесь вы можете увидеть визуализацию работы быстрой сортировки (а также многих других алгоритмов).


А вот так выглядит реализация сортировки Хоара на JavaScript:

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Подробный разбор алгоритма сортировки Хоара


Давайте подробно разберём, как работает данная сортировка.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Создаем функцию quickSort() и передаем аргументом неотсортированный массив.


Дальше, как вы помните, необходимо определить базовый случай выхода из рекурсии.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Так как нам предстоит дробить основной массив на подмассивы и сортировать элементы в этих подмассивах относительно опорного элемента (об этом ниже), то как только такие подмассивы будут содержать по одному элементу или будут пустыми, нам нет смысла дальше продолжать разбивать их на более мелкие части, поэтому здесь мы выйдем из рекурсии.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Теперь определим индекс в массиве так называемого опорного элемента. Для этого создадим переменную pivotIndex, передадим в функцию Math.floor длину массива, поделим результат на 2 и получившееся число присвоим переменной pivotIndex. Функция Math.floor, как вы знаете, округляет результат в меньшую сторону:

Math.floor(5.5); // 5

Затем определим сам опорный элемент. Для этого кладем в переменную pivot значение массива по индексу pivotIndex. В массиве arr значением pivotIndex будет 5 (длина массива — 11. 11 делим на 2 и округляем в меньшую сторону, получаем 5). Значением pivot будет -12.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Дальше нужно объявить два пустых подмассива less и greater. В массив less будем сохранять все элементы, которые меньше опорного, а в greater все элементы, которые больше опорного.


Дальше в цикле for мы пробегаем по всем элементам массива и сравниваем каждый элемент с опорным.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Затем у нас идут три условия. В первом условии мы сравниваем индекс текущей итерации цикла с индексом опорного элемента в массиве.


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


Далее во втором условии мы сравниваем элемент массива с опорным элементом. Если опорный элемент больше, то добавляем наш текущий элемент массива в массив less.


В противном же случае, добавляем текущий элемент массива в массив greater (третье условие).


В итоге, после завершения цикла for, у нас на выходе будет 2 массива: less с числами меньше опорного и greater с числами больше опорного или равными ему.


И дальше мы возвращаем массив, в который разворачиваем результат рекурсивного выполнения функции, принимающей в качестве аргумента массив less. Дальше вставляем наш опорный элемент pivot, а после снова разворачиваем результат выполнения функции для массива greater.

Не так страшен черт, как его малюют. Объясняем рекурсию в Javascript простыми словами Программирование, IT, Полезное, Алгоритм, Рекурсия, Javascript, Web-программирование, Web, Веб-разработка, Длиннопост

Когда функция доходит до базового случая, рекурсивный вызов функции заканчивается и все одиночные массивы соединяются в один большой отсортированный массив.


Выведем в консоль результат работы функции и убедимся в этом.


Быстрая сортировка в среднем и лучшем случае выполняется за Θ(n * log(n)) и Ω(n * log(n)) соответственно.


В худшем случае время выполнения алгоритма занимает О(n^2).


Более подробно про лучшее, среднее и худшее время выполнения алгоритма быстрой сортировки можно прочитать здесь.



Спасибо тем, кто дочитал, пишите ваше мнение, вопросы и предложения в комментариях. Не забудьте поставить плюсик этому посту, если он вам понравился :3

Показать полностью 25
[моё] Программирование IT Полезное Алгоритм Рекурсия Javascript Web-программирование Web Веб-разработка Длиннопост
6
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии