JS введение: подборка практики и решении

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


Факториал числа

Посчитать факториал числа. Определение факториала.

function fc(num) {
    if (num > 0) {
        var i = 1,
            result = 1;
        while (i <= num) {
            result *= i;
            i++;
        }
        return result;
    } else {
        return 1;
    }
}

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

function fc(num) {
    return (num > 0) ? (num === 1) ? 1 : num * fc(--num) : 1;
}

Императивный стиль отвечает на вопрос как мы выполняем вычисление (используя цикл, счетчик и перемножение в теле цикла), а декларативный отвечает что мы делаем здесь. Если не обращать внимания на вложенный тернарный оператор, который задает ограничение, то в теле функции увидим описание вызова функции самой себя (рекурсия) с декрементированным числом, в качестве аргумента, помноженное на себя (число перед декрементом) и терминальный случай (num === 1), при котором заканчивается рекурсия. Рекурсивный процесс в этом контексте, — это серия последовательно отложенных вызовов ( num x fc(num - 1) x fc(num - 2) x ... x fc(num - n) ), которые в самом конце вычисляются за один раз, возвращая результат.

Сумма последовательности целых чисел

Реализовать (с использованием рекурсивного процесса) функцию sequenceSum, которая находит сумму последовательности целых чисел. Последовательность задается двумя значениями: begin — начало последовательности, end - конец последовательности.

function sequenceSum(begin, end) {
    return (begin > end) ? NaN : (begin === end) ? end : begin + sequenceSum(++begin, end);
}

Наименьший делитель числа

Итеративный рекурсивный процесс

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

function smallestDivisor(num) {
    function process(num, divisor) {
        if (num === 1) {
            return 1;
        } else if (num === 0) {
            return 0;
        } else {
            if (num % divisor === 0) {
                return divisor;
            } else {
                if (divisor === num)
                    return num;
                return process(num, ++divisor);
            }
        }
    }
    return process(num, 2);
}

Императивный итеративный процесс

Та же самая задача, но:

  • не использовать рекурсию
  • использовать переменные
  • использовать цикл while
function smallestDivisor(num) {
    var divisor = 2;
    if (num === 1) {
        return 1;
    } else if (num === 0 || num < 0) {
        return NaN;
    } else {
        if (num % divisor === 0)
            return divisor;
        else
            while (num % divisor !== 0)
                divisor++;
        return divisor
    }
}

Перевернуть строку

Реализуйте функцию reverse, которая переворачивает строку:

function reverse(str) {
    var buf = [];
    if (str === '') {
        return '';
    } else {
        for (var i = str.length - 1; i !== 0; i--)
            buf.push(str[i]);
        return buf.join('') + str[0];
    }
}

Проверка на простое число

Напишите функцию isPrime. Она принимает число и возвращает true, если число является простым, и false в ином случае. Простое число — целое положительное число, имеющее ровно два различных натуральных делителя — единицу и самого себя. Например, 7 — простое число, потому что делится без остатка только на 1 и на себя. 2017 — другое простое число. Используйте цикл for и арифметические мутаторы.

function isPrime(num) {
    if (num >= 0) {
        switch (num) {
            case 0:
            case 1:
                return false;
            case 2:
                return true;
            default:
                for (var i = 2; i < num; i++) {
                    if (num % i === 0)
                        return false;
                }
                return true;
        }
    } else {
        return false;
    }
}

Cравнение строк по заглавным символам

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

function bigLettersCount(str) {
    var counter = 0,
        lng = str.length;
    for (var i = 0; i < lng; i++) {
        if (str[i].toUpperCase() === str[i])
            counter++;
    }
    return counter;
}

function compare(first, second) {
    const firstCount = bigLettersCount(first);
    const secondCount = bigLettersCount(second);
    return (firstCount === secondCount) ? 0 : (firstCount > secondCount) ? 1 : -1;
}

Сложение всех входящих в число цифр

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

Для числа 38 процесс будет выглядеть так:

  • 3 + 8 = 11
  • 1 + 1 = 2
  • Результат: 2

Пример:

  • addDigits(10); // 1
  • addDigits(19); // 1
  • addDigits(38); // 2
  • addDigits(1259); // 8
function check(num) {
    return (num.length > 1) ? 1 : 0;
}

function sum(one, two) {
    return parseInt(one) + parseInt(two);
}

function addDigits(num) {
    var size = num.length;
    if (check(num)) {
        var j = 0,
            res = 0;
        while (j < size) {
            if (j === 0) {
                res += sum(num[size - ++j], num[size - ++j]);
                if (isNaN(res))
                    return NaN;
                if (check((res + '')))
                    res = addDigits((res + ''));
            } else {
                res = sum(res, num[size - ++j]);
                if (check((res + '')))
                    res = addDigits((res + ''));
            }
        }
        return res;
    } else {
        return parseInt(num);
    }
}

Заглавные буквы

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

solution('hello, world!'); // Hello, World!

function solution(str) {
    var collection = str.split(' '),
        space = '',
        word = '';
    for (var i = 0; i < collection.length; i++) {
        var temp = [];
        if (collection[i] !== "") {
            for (var j = 0; j < collection[i].length; j++) {
                if (j === 0)
                    temp.push(collection[i][j].toUpperCase());
                else
                    temp.push(collection[i][j]);
            }
            space = (i + 1 === collection.length) ? '' : ' ';
            word += temp.join('') + space;
        } else {
            word += ' ';
        }
    }
    return word;
}



Похожие заметки:

Корзина на сайте — часть 2

В статье рассказывается как c помощью simpleCart.js делать такие вещи:

  • Выводить товары в том виде, в котором вам надо
  • Обрабатывать переданные товары и возвращать результат
  • Делать дальнейшие операции с заказом

Открыть здесь

1348

Скрипт динамической ширины

Скрипт для равномерного распределения блоков по ширине родительского контейнера. В качестве контейнера может выступать любой блок как определенной ширины, так и неопределенной, вплоть до body. Что умеет?

  • Нарезать блоки на одинаковую ширину в зависимости от заданного количества колонок
  • Генерировать нужное количество колонок
  • Проставлять clearfix после оканчивающей ряд колонки, чтобы вовремя отменить обтекание
  • Удалять лишние clearfix

Открыть здесь

267

Корзина на сайте — часть 1

В статье рассказывается как создать JavaScript корзину на сайте с помощью плагина simpleCart.js

Открыть здесь

559


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии