В чем отличие процедурного от функционального программирования?
Пример в контексте JavaScript:
Процедурный стиль:const array = ['first', 'second'];

let output;

function allOdd(words) {
  let result = true;

  for (let i = 0; i < words.length; ++i) {
    const len = words[i].length;

    if (len % 2 !== 0) {
      result = false;
      break;
    }
  }

  return result;
}

output = allOdd(array);

alert(output);
Функциональный стиль:function length(string) {
  return prop('length', string);
}

function odd(number) {
  return equals(modulus(number, 2), 0); 
}

function allOdd(...words) {
  return every(compose(odd, length), words);
}

alert(allOdd('first', 'second'));
Реализации prop, modulus, equals, every и compose оставлены за кадром. Думаю, из их названия легко понять какой результат они возвращают.
В декларативном программировании, Вы разъясняете: я хочу, чтобы факториал n был n раз факториалом n-1(как в определении факториала в математике). Декларативное - это что.const factorial = (n) => {
  return (n === 0) ? 1 : n * factorial(n-1);
}
В императивном, Вы приказываете четко передвигаться по шагам - умножать это на это, пока идет отсчет и запоминаются какие-то числа.const factorial = (n) => {
  const iter = (counter, acc) => {
    return (counter === 0) ? acc : iter(counter - 1, counter * acc);
  }
  return iter (n, 1);
}Императивное - это как.